- 投稿日:2020-04-05T20:01:57+09:00
Linux でカーソルを自分で選んだ写真にする
もともとあるカーソルテーマを少しいじる。
~/.icons とかにカーソルテーマがインストールされてると思う。
~/.icons/"カーソルテーマ"/cursors/ 内にあるのが各種カーソルファイル。ファイルの形式は X11 カーソルファイル。
これらカーソルファイルを自分の好きなカーソルファイルに置き換えればいい。
ちなみに一番一般的な左上向いた矢印は left_ptr ファイルである。
- 投稿日:2020-04-05T18:11:51+09:00
シンボリックリンクとハードリンクの違いって?
シンボリックリンクとハードリンクの違いや使い分けについてご存知でしょうか?
自分はよく知らなかったので、関連する記事をいろいろ探してみました。図として直感的にわかりやすかったのはこちらの記事。
それぞれの特徴についてもわかりやすく書かれています。
https://eng-entrance.com/linux-permission-linkシンボリックリンク
シンボリックリンクはショートカットというイメージがわかりやすいのではないでしょうか?
original_fname
というファイルを参照するシンボリックリンクsymkink_fname
を作成することを考えてみましょう。./original_fname
./symlink_fnameここで
cat ./symlink_fname
を実行すると
cat ./original_fname
と同等の操作を意味するはずです。
つまり、rm ./symlink_fname
は
rm ./original_fname
と同等になってしまい、元のファイル
original_fname
を削除することになってしまいます。これに関して、シンボリックリンク削除時の注意点が例えばこの記事に書かれています。
https://mimirswell.ggnet.co.jp/blog-165
要はrm
コマンドでもリンクを削除できるけど、危ないからunlink
を使おうね、という話です。ハードリンク
これに対し、ハードリンクはどうでしょうか。
./original_fname
./hardlink_fnameそれぞれのパスは同じ実体ファイルを指し示すことになります。
この状態でopen ./hardkink_fnameを実行すると、
open <実体ファイル>の意味になります。
面白いのは、実体ファイルへの参照カウンタのようなものがあり、rm ./hardkink_fname
を実行すると、
./hardkink_fname
というパスは削除されてしまいますが、実体ファイルは削除されません。なぜなら、今考えている状況だと元々
./original_fname
./hardlink_fname
の2つの「参照」が存在していたため、「参照」を1つ削除してもまだ1つ残っているからです。そして、「参照」の数が0になると、実体も削除されるらしいです。
inodeと実体ファイル
今までイメージを掴むために「実体」や「参照」という言葉を使ってきましたが、きちんと説明するにはinodeに触れる必要があります。
わかりやすいのはこちらの記事でしょうか。
https://qiita.com/katsuo5/items/fc57eaa9330d318ee342ハードリンクの使い道
一般的に使われるのはシンボリックリンクの方らしいですね。
では逆に、ハードリンクはいつ使われるのでしょうか?こちらの質問に対する回答を読むと、なるほど!と思えます。
https://q.hatena.ne.jp/1265361495IMAPサーバで、送信先が複数人のメールを参照するのに使われているとのこと。
コピーせずに済む&適切に削除が行われる、ということですね。...勉強になりました!
- 投稿日:2020-04-05T13:39:32+09:00
Oreilly サイバーセキュリティプログラミング 初期セットアップについて
Oreilly出版サイバーセキュリティプログラミングにおいて初期セットアップが初学者の私には難しすぎたので、調べ、わかりやすかった記事を参考にセットアップを進めていきます。
一応共有用でもあるので、見づらい場所や間違っているところなど指摘していただけるとありがたいです。
なおIDEについては Wing IDE ではなく VSCode を使用しています。ここは書籍と異なっています。1. VMwareとKaliLinuxのダウンロード
まずは書籍にある通りVMwareとKaliLinuxをダウンロードしていきます。
1.1 VMwareのダウンロード
VMwareのダウンロードはこちらの記事がとても分かりやすかったので、ぜひそちらを
1.2 Kali Linuxのダウンロード
Kali Linuxは本書と同じno starch pressからダウンロードします。
リンクに飛ぶと以下のページにアクセスできますので、Download the Kali Linux vitual machine used in the book(i486)(表紙画像の下 ・ の三番目をクリック
すると以下のようなページに移動します。
-KALI LINUX VMWARE IMAGESのKali Linux VMware 64-Bitをクリック
DL(ダウンロード)が完了したら、7-zipやLhaplusなどの解凍ソフトを使ってファイルを解凍します。
解凍したファイルをクリックすると、いかのようなVMXファイルがありますのでそちらを 1.右クリックで選択
2.プログラムから開く 3.VMwareを選択(もし選択欄になければ、その他のアプリをクリックしそこから選択)
するとKali Linuxが開くと思いますので、初期のユーザーネームとパスワードはどちらもkaliに設定されていますので、ログインしてください。
言語の初期設定は英語になっていますので、日本語に変更したい方はぜひこちらの記事を参考に変更してください。2 Python2.7のpipインストール
私のKali Linuxでははじめからpython2.7が入っていたのですが、どうやらpipまでは入っていなかったらしく、pipコマンド(pythonで外部モジュールをインストールするときに必要)が使用できませんでした。そこでこちらの記事を参考にpipをインストールすることができましたので、pipがインストールされていない方はそちらを参考にインストールしてください。
3 VScodeのダウンロード
書籍ではWing IDEというIDEを紹介していますが、私はVScodeが使い慣れていたので、そちらをDLしました。
Kali Linuxでのウェブブラウザの開き方は
タスクバーの一番左のドラゴン?のアイコンをクリックして、検索欄にFire foxと入力して、出てきたFirefox ESRをクリックして開いてください。(デスクトップに置いておきたい方は開く前に最初に右クリックし、デスクトップに追加を選択)FirefoxのURL検索欄にこのURLを入力またはコピーして貼り付け(恐らくwindowsでコピーしたものもCtrl+vで貼り付けできるはず)すると以下のようなサイトに飛びますので、Linux(ペンギン)の.deb形式をDLします。
DLした.deb形式のデータは恐らくdownload(ダウンロード)という場所に保存されていますので、以下の画像の左から四番目の
ターミナル(黒いアイコン)をクリック
cd Downloads
と入力するとdownloadディレクトリに行けます。そこで、書籍の1.2にあるコマンド同様
kpkg -i code_1.43.2-1585036376_amd64.deb
と入力これでターミナルでインストールが始まれば無事VScodeをDLすることができるはずです。
必要ならFirefox同様にデスクトップに設置しておいたほうがいいでしょう。
VScodeの日本語化はこちらの記事を参考に行いました。以上がVMwareからVScodeまでのインストールの説明になります。
書籍とは若干違った設定になりますが、これで本書を読み進めることが可能となりました。
Kali LinuxはのディストリビューションがDebian系統なので何か困ったときはLinux Debianなどで検索するといいかもしれませんコマンドも系統によって変わってくるので注意が必要です。
もし時間と余力があれば2章(GitのDL, GigHubからparamikoでもファイルの取得, SSH)などもやっていきたいです。VMware
DL: https://bright-east-blog.com/skill-up/vmware15-install-win10
Kali Linux
日本語化: https://doruby.jp/users/r357_on_rails/entries/Kali-Linux-2020
python
pip install: https://turtlechan.hatenablog.com/entry/2019/06/17/181826
VSCode
DL: https://code.visualstudio.com/download
日本語化: https://qiita.com/ntkgcj/items/e77331932c7983dea830
- 投稿日:2020-04-05T10:28:19+09:00
プログラミング初心者の私が気になったワード
Ubuntuてよく聞くけど何?
Linuxディストリビューションの一つ。
まって、「Linux」て何?「でぃすとりびゅーしよん」て何?
Linuxとは、OS(Operating System)の一つ。OSはLinuxの他に、MacのOS XやWindowsOS などがある。
LinuxはオープンソースのOSで、ユーザーはそれを使ってまた新しいOS的なものを開発することができる。そうしてできたものをディストリビューションという。
そして話は戻り、UbuntuとはLinuxというOSを元に開発されたディストリビューションの事。(厳密にいうとUbuntuは、これもまたLinuxディストリビューションのDebianが元となって作られたもの)以下、その他の気になったワード(調べる予定)
Docker
Kernel
Virtual box
Shell
Bash
yml
- 投稿日:2020-04-05T05:14:23+09:00
Linux中級者への道: ネットワーク編
Linux初心者あるある - Qiitaの続編。
2020/04/05現在、COVID-19の世界的感染で、都市が封鎖されたり、外出の自粛が要請されたりしている。勤務も可能な限りテレワークが推奨されているので、大学の理系研究室でありそうな環境を念頭に、リモートで研究室外から研究室内のネット環境にアクセスするための必要事項をまとめる。インターネットからのイントラネットへのアクセス
イントラネット(例えば研究室内のネットワーク)からインターネット(例えば研究室外のネットワーク)は、通常制限が少なく、自由に出ていくことができる。この時、ゲートウェイサーバーを経由して外に出ていて、インターネットからは、イントラネットの構造は直接には見ることはできない。ゲートウェイの持っているグローバルIPアドレスからのアクセスのように見えている。
これとは逆にインターネットの特定のアドレスから、イントラネットに入る時、どのようなコマンドで、どのような事が出来るのか をここでは説明する。ここでは基本的にsshを使ったアクセスについて触れる。イントラネットの踏み台サーバー(Bastion server)にsshでアクセスする
ゲートウェイにグローバルIPアドレス/ホスト名が降られているため、このIPアドレス/ホスト名を頼りに、sshでアクセスをすればよい。アクセスにはIPアドレス/ホスト名が必要なので、イントラネットを管理している人に確認すること。このIPアドレスをwww.xxx.yyy.zzzとし、ホスト名をhost.gateとすると、userがユーザー名の時
ssh user@www.xxx.yyy.zzz ssh user@host.gateでアクセスが出来る(鍵が必要な場合後述)。多分このままではアクセスはできない。理由は、普通ポート番号は22からずれていて、それを指定していないため。説明の都合上必要なので、実際のログインはもう少し待ってほしい。仮に、ポート番号がデフォルトの22に場合、ここでアクセスできない場合は、そもそも自身がユーザーとして追加されていないか、ユーザー設定時のパスワードが誤っている可能性が高い。
ここで、一応実際に何が起きているのかについて、もう少しだけ説明する。
通常、ゲートウェイは専用機ルーターが兼ねていることが多く、この専用機ルーターには通常ユーザー情報は存在していない。すると、どこにログインしているのか?
その答えは、踏み台サーバー(bastion server)である。踏み台サーバーは、インターネットからイントラネットに入る際に、ルーターに来たアクセスを一手に担うサーバーである。外からイントラネットに入る際は、先ずはこのサーバーにログインすることになる。ポート番号をずらす
-p
通常ゲートウェイ、あるいは踏み台サーバーのsshプロトコルのポート番号はデフォルトの22番からずらされている。その理由は、インターネットに面したこうしたサーバーは常時不特定の計算機からログインが試みられており、22番はsshのデフォルトポートなので有望な攻撃対象になる。そこで、通常インターネットに面している計算機のsshでのアクセスにおいては、ポート番号は22からずらされている。
例えば、ポート番号が31415(円周率の最初の数字を五桁取っただけ)だったとする。そのとき、sshでのアクセスは以下のようにすればよい:
ssh -p 31415 user@www.xxx.yyy.zzz ssh -p 31415 user@host.gate鍵の指定
-i
デフォルトでは、sshはユーザー名と対応するパスワードで、そのログインができる。仮にポート番号が22の場合、よくあるユーザー名、推測されやすいパスワードであれば、容易に悪意のある人間/計算機のログインを許してしまう。こうした侵入を一段と困難にするためにsshの鍵認証の方法が使える。公開鍵をログイン先の所定の位置に置き、ログイン元の計算機に秘密鍵を置いておくことで、この鍵のペアが一致したときにのみ、ログインができるようになる。ここではRSA鍵を念頭に、鍵を使ったサーバーへのアクセス法について記載した。詳しくは「ssh 鍵認証」あたりで調べればわかる。
ログインのためのコマンドは、鍵を~/.ssh/id_rsa
に置いてあるときに-i
オプションで以下のように指定すればよい:ssh -p 31415 -i ~/.ssh/id_rsa user@www.xxx.yyy.zzz ssh -p 31415 -i ~/.ssh/id_rsa user@host.gate鍵を生成したときに指定したパスフレーズが聞かれるのでそれを入力する。
X Window Systemを使いたい
-X
,-Y
sshでリモートアクセスをすると、大方のアプリはウィンドウを手元に表示することができる。xtermとか、xpdf、xdviのようないかにもX window systemっぽいものから、gnuplot, firefoxとか大抵のGUIの画面は飛ばせる。(ただし、終了時に妙なデーモン残すアプリも結構あるので注意)解析したいデータがあるサーバーで立ち上げたいアプリ、またアプリが効果で特定のサーバーにしか入っていない場合、アプリのインストールが極めて面倒(OS、ライブラリ等の依存関係などで)で特定の計算機にしか入っていない場合などに有効。
こうした機能を使いたい場合は、-X
か-Y
のオプションを付ける。違いはいまいちわからないが、Macを使っている場合、前者は割と短いスパンで接続が切れ、後者の方が安定している。コマンドの例は以下の通りssh -X user@www.xxx.yyy.zzz ssh -X user@host.gate ssh -Y user@www.xxx.yyy.zzz ssh -Y user@host.gate遠隔地にあるサーバーとう、中途の通信の速度が遅い場合(携帯電話のネットワークとか)、通信内容を圧縮することで帯域を節約することができる。
man ssh
で見ると、速いネットワークを使う場合はむしろ遅くなる とのこと。ssh -XC user@www.xxx.yyy.zzz ssh -YC user@host.gate踏み台サーバーにログイン後、自動的にイントラネット内の他の計算機に移動したい
-t
イントラネットにおいて、通常踏み台サーバーはそれ用に用意されていて、一般に他の機能を有していない。通常は、踏み台サーバーにログイン後、クラスター計算機や、ファイルサーバー、個人で管理する計算機にログインしてデータを見る という需要が大きいだろう。こうした目的を達成したい場合、一つの方法として、踏み台サーバーにログインしたのちに
ssh -XC user@192.168.xxx.yyy
のような形で次のサーバーにログインする方法がある。しかし、これを毎回行うのは、端的に言って愚かで、自動化できるに違いないと感じると思う。素人が思いつく「こんなことできないだろうか」は必ずと言っていいほど誰かが実践していて、ウェブ上で情報がみつかる。今回のケースではsshに用意されているデフォルトオプションの-t
でこれが実現できる。
-t
オプションを指定して、ホスト名の右にログインした端末で実行したい端末上でのコマンドを書く。ssh -p 31415 -t user@www.xxx.yyy.zzz ssh user@192.168.xxx.yyy ssh -p 31415 -t user@host.gate ssh user@mylinux.intra一応
-t
が無くても、ホスト名の右に書いたコマンドは実行されるが、このケースでは-t
オプションが必須。このコマンドが実行されると、引き続く192.268.xxx.yyy/linux.intraのパスワードが聞かれるはず。コマンドは別に
-t
オプションを受けた変数というわけではないので、離れていてもいいのだけれど、個人的には、以下のようにくっつけて書いておいた方が好み:ssh -p 31415 user@www.xxx.yyy.zzz -t ssh user@192.168.xxx.yyy ssh -p 31415 user@host.gate -t ssh user@mylinux.intraあと、最終ログイン先からX飛ばしたい場合は
ssh -p 31415 -X user@www.xxx.yyy.zzz -t ssh -X user@192.168.xxx.yyy
としておけばOK。192.168.xxx.yyyで立ち上げたウィンドウが手元に飛んでくる。
-t
を使ったコマンドの応用何となくわかるように、別にとホスト名より右のコマンドはsshである必要はない。踏み台サーバーに限らず、ログインした計算機ですぐに実行したいコマンドがあれば、ここに書いておくと良い。
例えば、スーパーコンピューターのジョブの実行状況や、残りのバジェットを確認したいときはssh -t user@www.xxx.yyy.zzz qstat ssh -t user@super.computer point等と書いておけば、実行状況や残りポイント数を表示後、すぐにログアウトされる。あと、割と
-t
オプション無くても、いける場合も多い。ただ、この時コマンドに付随しているいくつかのオプション(多分どの設定ファイルが読み込まれいるかに依る)が無視されることがあるので、注意。特定のポートへのアクセスを手元のポートへのアクセスで代替したい
-L
研究室イントラネットにある特定の計算機へのポートアクセスを、アクセス元の計算機のポートに代替する/変換するポートフォワーディングという機能がある。例としては、以下に述べるjupyter notebookへのリモートアクセスや、sshへのアクセスが便利になる。
Jupyter notebook
-L 8888:192.168.xxx.yyy:8888
Jupyter notebookはデフォルトでは、立ち上げた端末上でブラウザが立ち上がる。実はリモートからのアクセスの設定をする(例えばリモートサーバでjupyter notebookを起動させローカル環境で使う - Qiita参照)ことで、イントラネットにあるアクセス制限のない計算機からはブラウザから
192.168.xxx.yyy:8888
を入力することでアクセスが出来る。この文字列の意味は、IPアドレス:ポート番号という事で、ポート番号が8888であることを意味している。複数回Jupyter notebookを立ち上げるとポート番号は通常8888, 8889, 8890と一つずつ大きくなっていく。
踏み台サーバーはイントラネットに存在しているので、ここからポートフォワーディングを行うことで、イントラネットの特定計算機のポートをログイン元の特定ポートに飛ばすことができる。例えばイントラネットにある192.168.xxx.yyyの8888をログイン元の8888あるいは18888に飛ばす場合の書き方は以下の通り:# -L [ログイン元のポート番号]:[イントラネットの計算機のIP]:[イントラネットの計算機のポート] ssh -p 31415 user@www.xxx.yyy.zzz -L 8888:192.168.xxx.yyy:8888 -t ssh user@192.168.xxx.yyy ssh -p 31415 user@www.xxx.yyy.zzz -L 18888:192.168.xxx.yyy:8888 -t ssh user@192.168.xxx.yyy
-t
より右のコマンドssh user@192.168.xxx.yyy
はポートフォワーディング自体には必要ないが、Jupyter notebookを立ち上げる際に、普通は一度対象計算機にログインする必要があるので、記載してある。既に8888番でアクセスできるJupyter notebookが立ち上がっているなら、このコマンドは不要。
ログイン元のポート番号は、基本的に任意で好きな数字を用意すればよい。ただ、0-1023は既存のよく使うサービスに予約されているので、指定しないほうが良い。ssh/sftpのアクセス
-L 10022:192.168.xxx.yyy:22
ここまで、述べてきたようにインターネットからは、イントラネットの様子は直接は見ることができない。イントラネットに踏み台サーバーを用意して、そこにゲートウェイ経由でログインすることで、イントラネットの中に入ることになる。一度踏み台サーバーにログインしてしまえば、ポートフォワーディングをすることで、以降もっと容易にイントラネットにアクセスできるようになる。その方法をssh/sftp接続を例にここで説明する。
踏み台サーバー上で、イントラネット内の計算機(192.168.xxx.yyy)の22番ポートをログイン元の10022にマップするようにしておけば、引き続く接続では自分自身の10022をsshのログイン先に指定することで、イントラネットの22番にアクセスしている挙動になる。そのための最初のコマンドはssh -p 31415 user@www.xxx.yyy.zzz -L 10022:192.168.xxx.yyy:22で、引き続いて以下のコマンドで、イントラネットの192.168.xxx.yyyにssh/sftpでアクセスできる:
ssh -p 10022 user@localhost sftp -P 10022 user@localhostここで、sftpのポート番号の指定は
-P
で、Pが大文字である事に注意。あと、sftpのバージョンによっては-Port=10022
とすることもある。man sftp
で要確認。
正直なところ、sshよりも、sftpの方がここでの設定のご利益は大きい。ファイルを所望の計算機にアップロードする場合、計算機がイントラネットにあると、素朴にやろうと思うと「sftpで先ず踏み台サーバーにファイルを置く」→「踏み台サーバーにsshでログイン」→「踏み台サーバーでsftpを実行し、所望の計算機にファイルを移動」という極めてだるい手続きになる。ポートフォワーディングを使うことで、この手間が一気に削減される。
「踏み台サーバーへのsshでログインはするのだから、手間は減っていないではないか」という批判が考えられる。sftpはインタラクティヴなアプリなので、手元とログイン先の両方の環境を見ながらアップロード/ダウンロードできる。一方、ファイルを一回踏み台サーバーに置く という手続きを経ると、例えばアップロード/ダウンロードしたファイルが間違っていた というケースで、すべての手続きを再度やり直すことになる。ポートフォワーディングを使って、直接sftpでつないでいれば、この種の問題は起きえない。イントラネットからしかアクセスできないウェブページを手元のブラウザで閲覧したい
-D
様々なレイヤーで、アクセスの制限がかかっていたり、認証の都合で一般のインターネットからはアクセスできないものの、イントラネットからはアクセスできるというウェブページがある。そこにポートフォワーディングを使ってアクセスする方法。
上で使ったポートフォワーディングは、ローカルフォワーディングというもので、ここではダイナミックフォワーディングを使う。オプションは-D
でポート番号を指定する:ssh -p 31415 -D 10080 user@www.xxx.yyy.zzzこのように書くと、ポート番号10080のSOCKSプロキシサーバーになる。ブラウザのプロキシサーバーの設定の項目でSOCKSホストにlocalhostを指定して、ポートに10080を指定することで、踏み台サーバーからブラウザでアクセスしているかのような挙動になる。
踏み台サーバー、及び経由のアクセスの設定をconfigファイルにまとめる
以上で、sshのオプションを駆使して、イントラネットにある様々な機能を有効にする手続きについて記載してきた。しかし、こうしたコマンドを毎回打つのはだるい。設定ファイルにまとめることが出来れば、かっこいい。その設定ファイルが
~/.ssh/config
である。これまで記載して機能を反映させたファイル(ぼくのかんがえたさいきょうの".ssh/configファイル)について説明する。基本的な文法は
Host [好きな名前] Hostname [IP/ホスト名} IdentityFile [鍵のpath] Port [ポート番号] LocalForward [ログイン元のポート] [イントラネットの計算機のIP]:[イントラネットの計算機のポート] DynamicForward [ダイナミックフォワーディングに使うポート番号] ForwardX11 [yesにするとX Window Systemを使う] Compression [yesにすると、通信内容を圧縮する] ProxyCommand [ログインした後に実行されるコマンド]という感じ。まとめると以下のようになる:
~.ssh/config# Host Bastion HostName 192.168.xxx.zzz IdentityFile /home/user/.ssh/id_rsa Host linux HostName 192.168.xxx.yyy Host Bastionout HostName www.xxx.yyy.zzz IdentityFile /home/user/.ssh/id_rsa Port 31415 Host linuxout HostName 192.168.xxx.yyy ProxyCommand ssh -XCW %h:%p Bastionout Host linuxtunnelout HostName 192.168.xxx.yyy ProxyCommand ssh -XCW %h:%p Bastionout LocalForward 10022 localhost:22 LocalForward 8888 localhost:8888 LocalForward 8889 localhost:8889 LocalForward 8890 localhost:8890 LocalForward 8891 localhost:8891 DynamicForward 10080 GatewayPorts yes Host linuxsecondout HostName localhost Port 10022 # HOST *out ServerAliveInterval 60 TCPKeepAlive yes Compression yes HOST * User user ForwardX11 yes ForwardX11Trusted yes最後の
SeverAliveInterval
とTCPKeepAlive
はインターネットを介してssh接続をつないでい置いた際に勝手に切断される現象を緩和するためのオプション。ここでは説明しない。Jupyter notebookは四つくらいは同時に立ち上げるだろうと見込んで、四つ連番で8888から8891までポートフォワーディングした。ログイン元ではJupyter notebookは同時に使用することはなさそうなので、ポート番号はイントラネットでのものと同じ番号にした。
ポートフォワーディングは、二度立ち上げるとワーニングを吐き、なんとも気持ち悪い。そこで、プレーンなlinuxout, ポートフォワーディングを目的にしたlinuxtunnelout, ポートフォワーディングした状態で引き続くアクセス用にlinuxsecondoutを用意した。ポートフォワーディングをしている際にGatewayPorts yes
を入れておくと、ポートフォワーディングをした計算機以外からもフォワードしたポートへのアクセスが許可される。
Host
の部分の名前にはワイルドカード(*)が使える。ここでは、X window systemはすべての接続に使いたかったので、Host *
の個所に記載してある。ここでは、インターネットからアクセスする場合はすべて*outという名前にしてあって、それらにはすべてsshが切断されないための設定と、通信の圧縮の設定を入れた。
man ssh_config
でマニュアルを見るとSince the first obtained value for each parameter is used, more host-spe‐
cific declarations should be given near the beginning of the file, and
general defaults at the end.とあるので、環境異存で変えたい変数はファイル上方に、一般の変数は極力下方に書く必要がある。
- 投稿日:2020-04-05T00:55:49+09:00
接続元によるLinuxのless終了時の挙動
疑問
「新しいLinuxの教科書」という本でLinux入門をしてみたところ、一部教科書通りにいかず、調べても出てこなかったので、備忘録的なものとして残します。
具体的にはChapter08-04の「exportコマンド」の使用例のところです。
この章では環境変数「LESS」に対して「--no-init」を設定し、lessコマンドの挙動変化を確認する(終了時に画面クリアしていたものが、画面クリアしなくなるようにする)というものなのですが、Hyper-Vから接続し操作をしていたところ、特に設定を変更しなくても画面クリアされない挙動をしており、なぜ教科書通りにならないのかわかりませんでした。
(aliasも確認しましたがlessに対しては設定なし)
なので初学者ですが、できる範囲で何が原因なのか調べてみました。調べてみた挙動
Linux上での(Hyper-Vからアクセスしたときの)動作(less /etc/crontab→qで終了)
画面がクリアされず、表示内容が残っていることが確認できます。ターミナルの(TeratermやGUIからターミナルを立ち上げたときの)動作(同上)
Terminalからアクセスした場合は、終了時に画面クリアされていることがわかります。
調べて分かったこと
lessのソースを見てみたところ、「is_tty」がTrueの時は画面クリアするようになっています。この変数は「isatty(1)」が設定され、ドキュメントを見るとターミナルから接続したときは"1"になるようです。lessのソース該当箇所:https://github.com/gwsw/less/blob/e27853c89be227ad7a1a81aefd2942c03bd32dad/main.c#L387isattyのマニュアル("1"は標準出力のことを示すようだ):https://linuxjm.osdn.jp/html/LDP_man-pages/man3/isatty.3.html
(2020/04/06:いただいたコメントをもとに確認したところ、確かにisatty(1)はどちらの場合も"1"を返していたため削除。@angel_p_57 さんありがとうございます!)- 環境変数$TERMがログインの仕方によって値が変わることを確認しました。
- Hyper-Vで接続した場合:linux
- GUIからターミナルを起動したり、外部から(teratermで)ログインした場合:xterm
- 上記環境変数TERMを変えてみると、ターミナルでもLinuxっぽい動作になったり、Linux上でもターミナルっぽい動作になったので、
isattyと関連していると思われます。$TERMと連動しているようです。- $TERMによって切り替える際、「端末情報(infocmp)」に「smcup」「rmcup」があるかどうかで動作が変わるとのことです。 (2020/04/06いただいたコメントをもとに修正。@angel_p_57 さんありがとうございます!)
私的結論
上記教科書はターミナルでの実行を想定しているため、原則としてLinuxに直接アクセスするのではなく、ターミナルで動かしてみるのがよいと思われます。