特定のホストで、マシンにsshしてecho $PATH
と入力すると、
/home/wxy/bin64:/home/wxy/bin:/usr/kerberos/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin
ssh Host 'echo $PATH'
を実行すると、次のようになります。
/usr/local/bin:/bin:/usr/bin
なぜこの矛盾があるのですか?
また、後者のコマンドを使用して前者の結果を確認したい場合はどうすればよいですか?
最初のシナリオでは、システムにログインして、いわゆるloginタイプの接続を実行します。ログインしている場合、ログインは$HOME/.bashrc
および$HOME/.bash_profile
のスクリプトをソースとします。シェルはBashです。これら2つのスクリプトは、通常、/etc/bashrc
ファイルと/etc/profile.d/*.sh
の下のファイルをソースにします。
2番目のシナリオでは、ファイル$HOME/.bashrc
のみを調達します。このタイプのログインはinteractiveと呼ばれます。
これらの詳細については、 bash man page の[〜#〜] invocation [〜#〜]セクションを参照してください== 。
この動作を変更するには、対話型実行の一部として$ HOME/.bashrc_profileを含めて、目的の動作を取得できます。
$ ssh user@remotehost '. $HOME/.bash_profile; echo $PATH'
-または-
$ ssh user@remotehost 'source $HOME/.bash_profile; echo $PATH'
セッション初期化ファイルは奇妙です ヒステリック 歴史的な理由。
ずっと前に、コンソールにログインしました。ログインすると、シェルが作成され、シェルは初期化ファイルをロードします。 Bourneスタイルのシェルには、/etc/profile
(すべてのユーザー用)と~/.profile
(各ユーザー用)の2つの初期化ファイルがあります。初期化ファイルは、PATH
などの環境変数を設定したり、すべてのセッションで実行したいアプリケーションをロードしたりできます(メールインジケーターなど)。シェルが ログインシェル でない場合は、何かを開始したり、環境変数を設定したりする必要があるため、初期化ファイルを実行する必要はありません。きっと…
実際、シェルは徐々にインタラクティブな機能を獲得したので、インタラクティブなシェル用の初期化ファイルが必要です。 Kshは~/.kshrc
を持ち、bashは~/.bashrc
を持ち、zshは~/.zshrc
を持ちます。
リモートインタラクティブログインは、/etc/profile
および~/.profile
を実行します。ただし、非対話型プログラムを開始する可能性があるため、非対話型ログインには適していません。残念ながら、非対話型ログイン用の初期化ファイルの標準は登場していません。
/etc/profile
と~/.profile
は、環境変数を設定するだけで、出力を生成したり、プログラムを起動したりしないことが確実な場合は、手動で実行できます。
ssh foo '. /etc/profile; . ~/.profile; somecommand'
.profile
にインタラクティブセッションでのみ意味のある部分がある場合は、条件付き命令内に配置できます。
## (in ~/.profile)
case $- in
*i*) # the Shell is interactive
newmail;;
esac
ログインシェルがbashの場合は、癖を利用できます。初期化ファイル~/.bashrc
は、インタラクティブシェルと、親プロセスがrshd
またはsshd
と呼ばれる非インタラクティブシェルによって読み取られます。他のシェルにはこの癖はありません。
## (in ~/.bashrc)
case $- in
*i*) # interactive Shell: set Prompt, completion settings, key bindings, etc.
…;;
*) # non-interactive Shell: our parent must be rshd or sshd
. ~/.profile;;
esac
bashを使用している場合は、ホストで/etc/profile
をチェックして、予期した出力を取得できないことを確認してください。ファイルが存在する場合、bashは最初にファイル/etc/profile
からコマンドを読み取り、実行することに注意してください。そのファイルを読み取った後、~/.bash_profile
、~/.bash_login
、および~/.profile
をこの順序で検索し、存在し、読み取り可能な最初のコマンドからコマンドを読み取って実行します。