$ PATHが正しく指定されていても、Bashがコマンドを見つけられないのはなぜですか?


9

/ etc / profileファイルにコマンドへのパスを指定しています:

export PATH=$PATH:/usr/app/cpn/bin

私のコマンドは次の場所にあります:

$ which ydisplay 
/usr/app/cpn/bin/ydisplay

したがって、「echo $ PATH」出力を実行すると、次のようになります。

$ echo $PATH
...:/usr/app/cpn/bin

そして、すべてが大丈夫ですが、SSH経由でコマンドを起動しようとすると、エラーが発生します。

$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found

しかし、私の道はまだ存在しています:

$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin

SSHセッション中にBashがydisplayを見つけられない理由と、この問題を回避するためにSSHを適切に構成する方法を教えてください。

さらに、現在のユーザーのローカルファイル.bashrcで$ PATHを指定すると、すべて正しく動作します。しかし、ユーザーごとに多数のファイルを指定するのではなく、1つのファイルのみを変更したいと思います。これが私が求めている理由です。


1
実行しているだけydisplayですか?動作しssh 127.0.0.1 /usr/app/cpn/bin/ydisplayますか?
Bananguin 2012

@ user1129682はい、完全指定された名前のydisplayは機能し、ydisplayのみが機能します
SIGSEGV

ログインしていない(リモートセッションがない)が、リモートでコマンドを送信するだけの場合、.bashrc / .profileファイルが実行されないため、同じ方法で環境変数にアクセスできません。これは、現在のセッションの変数を設定する責任があるためです。
mnmnc 2012

14
余談ssh 127.0.0.1 echo $PATHですが、あなたが思っているようには動作しません。sshが実行される前にシェルが$ PATHを展開するため、何も証明も反証もされません。
Ulrich Schwarz

2
このstackoverflowの質問はいくつかの助けになるかもしれません
bsd

回答:


5

tl; dr

ではなくssh 127.0.0.1 ydisplayソースを実行します。代わりにパスを変更してください。~/.bashrc/etc/profile~/.bashrc

細部

唯一の時間/etc/profileあなたのシェルは「ログインシェル」である時に読み込まれるのです。

バッシュリファレンス・マニュアル

ログインシェルとしてbashが呼び出されると、...最初に/ etc / profileファイルからコマンドを読み取り、実行します。

ただし、を実行するとssh 127.0.0.1 ydisplaybashはログインシェルとして起動されません。それでも、別の起動ファイルを読み取ります。Bashのリファレンスマニュアルは言います:

...が... sshdによって実行されたとき。...からコマンドを読み取って実行します~/.bashrc

したがって、PATH設定をに配置する必要があります~/.bashrc

ほとんどのシステム、~/.bash_profileソース~/.bashrc~/.bashrcは、両方のファイルに設定を置くのではなく、設定のみを入れることができます。

そこにすべてのユーザーの設定を変更する標準的な方法はませんが、ほとんどのシステムが持っている/etc/bashrc/etc/bash.bashrcまたは類似しました。

それが失敗した場合は、をセットアップしpam_envてにPATH設定し/etc/environmentます。

以下も参照してください。


1

歴史的に、プロファイルファイル(/etc/profileおよび~/.profile)は、ログイン時に呼び出され(テキストコンソールで他に何ですか?)、多くの目的を果たしました。

  • セッションの環境変数およびその他のパラメーター(umaskなど)を設定します。
  • セッションの開始時に追加のプログラムを実行します(Eメール通知など)。
  • シェルとは異なる場合(たとえば、別のシェルまたはXウィンドウ)、セッションのプログラムを実行します。
  • 端末パラメータを設定します(例:)stty
  • シェルパラメータ(エイリアスなど)を設定します。

これらの目的はすべて、後でないと個別に識別されませんでした。プロファイルスクリプトは、対話型セッション(端末の対話、他のプログラムの起動)でのみ意味のあることを行う可能性があるため、リモートシェル呼び出し(rsh)が導入されたとき、rshの作成者はリモートシェルをログインシェルとして呼び出さないことを決定しました。プロファイルスクリプトが実行されないようにします。(一部のバージョンのにrshdは、リモートシェルをログインシェルとして実行するオプションがあります。)Sshは、rshのドロップイン置き換えとなるようにこの動作をコピーしました。

プロファイルスクリプトを実行する場合は、スクリプトを明示的に呼び出すことができます。

ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'

.シェル内でプロファイルスクリプトをロードするコマンドに注意してください。これらは、外部プログラムではなく、シェル内で実行されるコマンドです。

すべてのユーザーに対してグローバルに環境変数を設定する場合、多くのシステムで別の方法があります。それを/etc/profileで定義する代わりに、で定義し/etc/environmentます。このファイルはpam_envモジュールを通じて読み込まれます。ほとんどのLinuxディストリビューションは、それを読み取るように設定されています。

ログインシェルがbashの場合は、さらに可能性があります。通常、環境変数はに設定しない.bashrcください(インタラクティブシェルを使用して端末を経由する場合を除いて、Xセッションでは設定されません。テキストコンソールまたはそれ以上でインタラクティブにログインした場合は設定されないためです。 ssh(別のプログラム内でシェルを呼び出すと、カスタム設定が上書きされるため)。ただし、bashには私が理解したことのない奇妙な機能があります。これ~/.bashrcは、2つの無関係な状況で読み取られます。

  • ログインシェルではないインタラクティブシェル。
  • ログインシェルではない非インタラクティブシェルで、bashがrshdor によって呼び出されたと判断した場合sshd

sshでコマンドを実行すると、2番目のケースになります。を読んだり/etc/profile.profileからプロフィールを読んだりすることができます.bashrc。次のコードをに含めます~/.bashrc

case $- in
  *i*) :;; # this is an interactive shell, fine
  *) # This is not an interactive shell! This must be a non-interactive remote shell session.
    . /etc/profile; . ~/.profile
    return;;
esac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.