web-dev-qa-db-ja.com

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

なぜこの矛盾があるのですか?

また、後者のコマンドを使用して前者の結果を確認したい場合はどうすればよいですか?

7

最初のシナリオでは、システムにログインして、いわゆる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'

参考文献

12
slm

セッション初期化ファイルは奇妙です ヒステリック 歴史的な理由。

ずっと前に、コンソールにログインしました。ログインすると、シェルが作成され、シェルは初期化ファイルをロードします。 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をこの順序で検索し、存在し、読み取り可能な最初のコマンドからコマンドを読み取って実行します。

0
Raza