0

psshと呼ばれるこのツールを使用して、多数のホストに一緒に SSH で接続しています

それを使用する構文は次のとおりです。

pssh [OPTIONS] command [...]

例えば:

pssh -h hosts.txt uptime

ここで、hosts.txt は、すべてのホストの IP アドレスを含むファイルです。上記のコマンドは問題なく動作します。uptime を ls に置き換えても、問題なく動作し、それぞれのマシン上のすべてのファイルの正しい内容が表示されます。

問題は、そのコマンドを echo $PATH に置き換えると、パスが表示されることです

このコマンドを使用する場合:

pssh -h ips.txt which java

次に、すべてのホストについて、次のエラーが表示されます。

which: no java in (/usr/local/bin:/bin:/usr/bin)

通常の ssh コマンド () を使用して手動でホストの 1 つだけに ssh すると、

which コマンドを実行するか、$PATH 変数を確認すると、次のようになります。

-bash-3.2$ echo $PATH
/home/xx/bin64:/home/xx/bin:/usr/kerberos/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin
-bash-3.2$ which java
/home/xx/bin/java
-bash-3.2$ 

したがって、これは、少なくとも 1 台のマシンに Java がインストールされ、正しいパスが構成されていることを示しています。では、なぜこのコマンドをすべてのホストで機能させることができないのか、誰か教えてもらえますか?

4

1 に答える 1

2

接続先のサーバー$PATHは、リモートで実行されているシェルがログイン シェルかインタラクティブ シェルかによって異なる設定をしている可能性があります。対話的に ssh すると、対話型のログイン シェルがサーバー上で呼び出されます。非インタラクティブに ssh を実行すると、非インタラクティブで非ログインのシェルが呼び出されます (-cインタラクティブ モードに入らずに指定されたコマンドを直接実行するオプションを使用)。

多くのシェルは、ログイン シェルまたは対話型シェルとして呼び出されるかどうかに応じて、さまざまな起動ファイルをソースします。たとえば、bash~/.profileは、ログイン シェルである場合と、複雑なシェルである場合にのみ読み取り (またはバリアント) を~/.bashrc行います。$PATHサーバーは、おそらくこれらの起動ファイルの 1 つから Java のディレクトリを含む をセットアップします。

これに対する解決策は、シェル起動ファイルからではなく、from$PATHなどの環境変数を設定することです。/etc/environment

于 2013-06-17T18:15:56.837 に答える