リモートBashソースが.bashrcの代わりに.bash_profileであるのはなぜですか?

リモートBashソースが.bashrcの代わりに.bash_profileであるのはなぜですか?

バッシュマニュアル説明する:

rshdBashは、リモートシェルデーモン(通常はシェルデーモン)やセキュアシェルデーモンによって実行されている場合など、ネットワーク接続に接続されている標準入力を使用して実行されていることを確認しようとします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を読みますが、他に理由があります。

おすすめ記事