特定のホストからシステムに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
なぜそのような違いがありますか?
また、後者のコマンドを使用して以前の結果を表示するにはどうすればよいですか?
答え1
最初のシナリオでは、システムにログインして呼び出された操作を実行します。ログイン接続タイプ。ログインはスクリプトを取得し$HOME/.bashrc
、$HOME/.bash_profile
ログインした場合はシェルはBashです。これらの2つのスクリプトは通常、ファイル/etc/bashrc
と/etc/profile.d/*.sh
。
2番目の場合はファイルをインポートします$HOME/.bashrc
。このタイプのログインと呼ばれます。インタラクティブ。
これについての詳細は、以下で確認できます。呼ぶ部分バッシュのマニュアルページ。
この動作を変更するには、 $HOME/.bashrc_profile をインタラクティブ実行の一部として含めることで、必要な動作を取得できます。
$ ssh user@remotehost '. $HOME/.bash_profile; echo $PATH'
-または-
$ ssh user@remotehost 'source $HOME/.bash_profile; echo $PATH'
引用する
答え2
ヒステリックな歴史的な理由から、セッション初期化ファイルは奇妙です。
ずっと前にコンソールにログインしました。ログインすると、一部の初期化ファイルをロードするシェルが表示されます。 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
答え3
Bashを使用している場合は、/etc/profile
ホストが期待どおりの出力を取得していないことを確認してください。 Bashは最初にこのファイル/etc/profile
が存在する場合はコマンドを読み取り、実行します。ファイルを読み込んだ後~/.bash_profile
、~/.bash_login
、 を順に探して存在~/.profile
し、読み取れる最初のファイルからコマンドを読み込み実行します。