バッシュマニュアル説明する:
rshd
Bashは、リモートシェルデーモン(通常はシェルデーモン)やセキュアシェルデーモンによって実行されている場合など、ネットワーク接続に接続されている標準入力を使用して実行されていることを確認しようとしますsshd
。 Bashがこのように実行中であると判断した場合、~/.bashrc
ファイルが存在し、読み取ることができる場合は、コマンドを読み取り実行します。
このBashソースは次~/.bashrc
のとおりです。
ssh user@host :
しかし、このBashソースは次のとおりです~/.bash_profile
。
ssh user@host
仕様によると、これら2つのコマンドの間には違いはありません。どちらの場合も、標準入力がネットワーク接続に接続されていませんか?
答え1
ログインシェルは最初に読み、/etc/profile
次に読みます~/.bash_profile
。
非ログインシェルを読ん/etc/bash.bashrc
でから~/.bashrc
。
これはなぜ重要ですか?
次の行のためman ssh
:
もし注文する指定すると、ログインシェルではなくリモートホストで実行されます。
つまり、sshコマンドにコマンド以外のオプションしかない場合は、次のようになります。
ssh user@host
ログインシェルが起動し、ログインシェルが読み込みます~/.bash_profile
。
SSHコマンドでは注文する、よい:
ssh user@host :
命令が行くところ:
(または何もしないところ)。
そうだろういいえ~/.bashrc
コンテンツを読むためにログインシェルを起動します。
リモート標準入力
リモート・システムの /dev/stdin に提供される tty 接続は、実際の tty または別のものにすることができます。
のための:
$ ssh isaac@localhost
/etc/profile sourced
$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0
$ ls -la /proc/self/fd/0
lrwx------ 1 isaac isaac 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3
$ ls -la /dev/pts/3
crw--w---- 1 isaac tty 136, 3 Dec 24 19:35 /dev/pts/3
開始されたbashに見られるように、TTY(ネットワーク接続ではない)で終わります。
コマンドを使用したSSH接続の場合:
$ ssh isaac@localhost 'ls -la /dev/stdin'
isaac@localhost's password:
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0
TTY リストは同じように始まりますが、/etc/profile はソースではありません。
$ ssh isaac@localhost 'ls -la /proc/self/fd/0'
isaac@localhost's password:
lr-x------ 1 isaac isaac 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]
これは、接続がパイプ(ネットワーク接続ではない)であることをシェルに通知します。
したがって、両方のテストケースでは、シェルは接続がネットワークから来ているかどうかを知らないため、読みません~/.bashrc
(ネットワーク接続についてのみ話している場合)。 ~/.bashrcを読みますが、他に理由があります。
答え2
「どうして」ではなく「なぜ」と聞かれたので、そんな観点から答えてみましょう。過去に起こったことが今日起こっていることにつながった理由の詳細な説明は次のとおりです。
2つの異なる起動ファイル(「profile」と「rc」)があるのは、過去にコンピュータで作業が行われていた一般的な方法が次のとおりでした。
実際の端末や他のワークステーションからログインしてログインシェル。シェルはユーザーのための環境を呼び出して
/etc/profile
設定します。~/.profile
ユーザーが入力したい環境を呼び出します。環境はXorgかもしれませんが、ほとんどの場合、GNU画面などのマルチプレクサです。
その後、環境(GNU画面など)は、親ログインシェルから環境を継承する追加(非ログイン)シェルを呼び出します。
csh
これは開発中にUNIXシステムにログインする一般的な方法ですbash
。だから~/.profile
もう一度読むことは無駄とみなされますとにかく環境を継承するシェルから。
bash
次に、~/.bashrc
これらの非ログインシェルの追加設定を追加します。 csh
(およびtcsh
)非ログインシェルにはいかなる種類の "rc"ファイルも追加しないでください。csh
/はtcsh
Bourneシェル(POSIXの一部)と互換性のあるシェルではありませんが、Bourneシェルと互換性がありますbash
。別のBourne互換シェルは、定義されている場合に非ログイン実行コマンド(「rc」)ファイルとして使用されるksh
環境変数(と呼ばれる)を追加します。ENV
ksh
はい。 Bourneシェルの最新バージョンでは、GNU画面(または同様の画面)と混在するシェルに表示されますが、ユーザーの画面には表示されないエイリアスやその他のクイックオプションの使用を容易にするために、追加の設定ファイルが追加されています。初めて入る時に受けます。マシン。
GDM(グラフィックディスプレイマネージャ)が登場し、GDMには独自の初期化ファイル(例えば、および~/.xinit
)~/.xsession
があるため、「プロファイル」ファイルと「rc」ファイルの間の区別は意味がなくなりました。その後、GDM内で宣言されたシェルは、ユーザーの希望に応じてログインシェルまたは非ログインシェルになり、非ログインシェルが常にログインシェルの親を持つ状況は無効になります。
追加
私のものの一つお気に入りのテーブルシェルの起動ファイルを比較すると、Bourne シェル互換シェルはこれらのファイルをprofile
使用しますが、他のシェルでは使用しない方法がわかります。過去には、初期シェル(食べ始めたシェル)がBourne互換シェルでなければならなかったからです。