「sshホストエコー$ PATH」とsshの後に$ PATHをマシンに印刷すると、なぜ他の結果が表示されるのですか?

「sshホストエコー$ PATH」とsshの後に$ PATHをマシンに印刷すると、なぜ他の結果が表示されるのですか?

特定のホストからシステムに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し、読み取れる最初のファイルからコマンドを読み込み実行します。

関連情報