web-dev-qa-db-ja.com

非対話型sshセッションでは、一部のシステムでPATHが設定されていません

環境を_.profile_に設定しました。私の_.profile_はべき等であり、_.bash_profile_、_.bashrc_、_.kshrc_および_.zshrc_はすべてソース_.profile_です。そうすれば、使用するボーン互換シェルに関係なく、またシェルがインタラクティブであるかログインシェルであるかに関係なく、常に同じ環境を取得できます。

これは、非対話型のssh(1)の使用法でも機能しますが、正確な理由はわかりません。

_iridium:aram$ ssh sunos.mgk.ro 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/sunos:/home/aram/bin/sunos/AMD64:/home/aram/bin/sunos/386:/home/aram/go/bin:/opt/local/bin:/opt/local/sbin:/usr/gnu/bin:/usr/bin:/sbin:/usr/sbin:/usr/sfw/bin:/usr/local/bin:/usr/local/sbin:/home/aram/plan9/bin
iridium:aram$ ssh iridium 'env|grep ^PATH'
PATH=.:/Users/aram/bin:/Users/aram/bin/darwin:/Users/aram/bin/darwin/AMD64:/Users/aram/bin/darwin/386:/Users/aram/go/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/plan9/bin
iridium:aram$ ssh crimson 'env|grep ^PATH'
PATH=.:/home/aram/bin:/home/aram/bin/linux:/home/aram/bin/linux/AMD64:/home/aram/bin/linux/386:/bin:/usr/bin:/sbin:/usr/sbin:/usr/games:/usr/local/bin:/usr/local/sbin
_

ただし、少数のシステムでは、これは機能しません。

_iridium:aram$ ssh ci20 'env|grep ^PATH'
PATH=/usr/bin:/bin
_

私はこの仕事をしようと試みてきましたが、成功しませんでした。私が試してみました:

  • bashの代わりに別のシェルに切り替えます
  • sshd_configでPAMを無効にする
  • pAMを有効にして、/ etc/environmentにBASH_ENVを設定します

これらは効果がなく、PAM設定に関係なく/ etc/environmentがまったく読み取られないようです。

Ssh呼び出しでbashを強制的にインタラクティブにするか、ssh呼び出しで環境を手動で取得する必要があることを示唆しないでください。ここで、根本的な問題を修正しようとしています。

この問題をデバッグしようとしている間、私はbashについていくつかのことを学びました。標準入力がソケットである場合、非対話型シェルであっても、bashは常にbashrcをソースするようです。一部のOpenSSHバージョンはそのようにbashを開始しますが、他のバージョンでは標準入力はパイプです。また、sshセッションで開始されたかどうかを検出しようとするbashのコードがあり、その場合、インタラクティブなステータスに関係なくbashrcもソースしますが、場合によっては、このコードはコンパイル時に無効になります。これらの事実は私の問題に関連しているようですが、どうすれば問題を解決できるかは明確ではありません。

3

私は問題が何であるかを完全に理解しました。

Sshdは、非対話型の非ログインセッションではなく、実際には非対話型のログインセッションを作成する必要がありますが、そうではありません。 Bashは、sshの使用状況を検出するのに非常に苦労し、インタラクティブであるかログインであるかに関係なく、sshdによって開始されたと判断した場合はbashrcをソースします。これを行うのはbashだけです。私はbashを使用しているため、他のシェルでは機能しませんでしたが、このソーシング動作に依存してきました。

Sshを検出する方法は2つあります。 stdinがソケットであるかどうかを調べ(1)、失敗した場合は、いくつかのSSH_変数を探します(2)。最近ではありませんが、opensshの動作方法が変更されたため、(1)stdinがソケットではなくパイプになっているため、(1)が再び動作することはありません。 (2)一部のLinuxディストリビューションでは有効になっていますが、他のディストリビューションでは無効になっています。有効になっているディストリビューションを使用しています。

Bashが行ったことは恐ろしく、これはとにかく確実に機能しないため、BASH_ENVを〜/ .ssh/environmentに設定しているので、常に機能するようになりましたが、残念ながら、PermitUserEnvironment yesをに設定する必要があります。 sshd_config.。

また、なぜ/etc/environmentに設定できないのかわからないため、すべてのユーザーで機能します。

3