3

jschのChannelExec(ではなく)でリモートコマンドを実行したい。ChannelShellどうやら環境変数はロードされていませんが、私のコマンドにはそれらが必要です:

_channel.setCommand("source /etc/bash.bashrc; source ~/.bashrc; echo $LD_LIBRARY_PATH");
_channel.connect();

LD_LIBRARY_PATH私のに設定されていますが、何も返しません~/.bashrc

_channel.setEnv("LD_LIBRARY_PATH", "/my/add/path:$LD_LIBRARY_PATH");
_channel.setCommand("echo $LD_LIBRARY_PATH");
_channel.connect();

どちらも機能しません-それでもechoコマンドの出力はありません。

何が悪いのか分かりますか?正確にいつ電話する必要がありますsetEnvか?私がする前connect()または後に?そして、なぜ暗黙の解決策が機能しsourceないのですか?

4

5 に答える 5

3

これを行う2番目の方法については、これが機能しないのは正常だと思います。SSHクライアントは必要な環境変数を送信できますが、これらのうちどれがターゲットプロセスに渡され、どれが単に無視されるかはサーバーの決定です。多くの場合、サーバーはLC_*TERMおよび同様の変数のみを許可するように構成されています。OpenSSH sshdの場合sshd_config、オプションを使用してこれを構成できますAcceptEnv。(現在のUbuntuシステムでは、デフォルトはですAcceptEnv LANG LC_*。)

$LD_LIBRARY_PATHまた、サーバーは値をシェル式として解釈しない可能性が高いため、変数の値にaを渡すことは機能しません。

第一に、なぜこれが機能しないのかわかりません。おそらく、bashrcスクリプトには、インタラクティブモードでない場合、または端末に接続されていない場合にすぐに終了するプログラミングが含まれていますか?完全に再現可能な例がここで役立つ場合があります。

于 2012-02-20T20:32:34.387 に答える
3

現在、回避策を見つけましたが、これは解決策ではありません。私の推測では、setEnv()JSch または Open SSH サーバーのいずれかでバグが発生しています。

回避策:

_channel.setCommand("export LD_LIBRARY_PATH=\"foo\" && echo $LD_LIBRARY_PATH");
于 2012-02-21T13:34:23.380 に答える
0

Acceptenvを継承する環境変数の名前またはパターンに設定すると、うまくいきました。ファイルは /etc/ssh/sshd_config にあります。

setEnv を使用するための RFC には、サーバー設定で環境変数の設定を承認する必要があることが記載されています。

AcceptEnv PATH
AcceptENV ORA*
于 2012-03-13T10:36:20.893 に答える