Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jsch ChannelExec上设置环境变量_Java_Ssh_Jsch - Fatal编程技术网

Java 在jsch ChannelExec上设置环境变量

Java 在jsch ChannelExec上设置环境变量,java,ssh,jsch,Java,Ssh,Jsch,我想在jsch中的ChannelExec(而不是ChannelShell)中运行远程命令。显然没有加载环境变量,但我的命令需要它们: _channel.setCommand("source /etc/bash.bashrc; source ~/.bashrc; echo $LD_LIBRARY_PATH"); _channel.connect(); 尽管在my~/.bashrc中设置了LD\u LIBRARY\u路径,但不返回任何内容 _channel.setEnv("LD_LIBRARY_P

我想在jsch中的
ChannelExec
(而不是
ChannelShell
)中运行远程命令。显然没有加载环境变量,但我的命令需要它们:

_channel.setCommand("source /etc/bash.bashrc; source ~/.bashrc; echo $LD_LIBRARY_PATH");
_channel.connect();
尽管在my
~/.bashrc
中设置了
LD\u LIBRARY\u路径,但不返回任何内容

_channel.setEnv("LD_LIBRARY_PATH", "/my/add/path:$LD_LIBRARY_PATH");
_channel.setCommand("echo $LD_LIBRARY_PATH");
_channel.connect();
也不起作用--仍然没有
echo
命令的输出


你知道怎么了吗?我到底什么时候需要调用
setEnv
?在执行
connect()
之前还是之后?为什么通过
源代码
的隐式解决方案不起作用呢?

对于第二种方法,我认为这不起作用是正常的。虽然SSH客户机可以发送它想要的任何环境变量,但是服务器决定哪些环境变量被传递到目标进程,哪些被忽略。通常,服务器配置为只允许
LC.*
术语和类似变量。对于OpenSSH sshd,您可以在中使用选项
AcceptEnv
进行配置。(在当前的Ubuntu系统上,默认值是
AcceptEnv LANG LC.*

此外,在变量的值中传递
$LD_LIBRARY_PATH
将不起作用,因为服务器很可能不会将该值解释为shell表达式


首先,我不知道为什么这不起作用。如果不是在交互模式下,或者如果没有连接到终端,bashrc脚本中可能有一些编程可以立即退出?一个完整的可复制示例可能会有所帮助。

我现在找到了一个解决方法,但这不是一个解决方案。我的猜测是,无论是在JSch还是在OpenSSH服务器中,
setEnv()
都有缺陷

解决办法:

_channel.setCommand("export LD_LIBRARY_PATH=\"foo\" && echo $LD_LIBRARY_PATH");
将Acceptenv设置为要继承的环境变量的名称或模式对我很有用。文件位于/etc/ssh/sshd\u config

使用setEnv的RFC提到服务器设置必须批准环境变量的设置

AcceptEnv PATH
AcceptENV ORA*

根据SSH RFC,术语变量是在初始化SSH连接时设置的。这是最初设置的,与AcceptEnv无关。

正如其他人所说,为了调用_channel.setEnv(),您需要更改AcceptEnv。 Jcraft默认发送vt100

在RequestPtyReq.java中:

   class RequestPtyReq extends Request{
      private String ttype="vt100";
      private int tcol=80;
      private int trow=24;
      private int twp=640;
      private int thp=480;
你试过了吗

_channel.setCommand("echo \\$LD_LIBRARY_PATH");

注意在“美元”($)符号前加上“双反斜杠”(\\)

你真的在使用
\u channel.setEnv(“LD\u LIBRARY\u PATH”=“/my/add/PATH:$LD\u LIBRARY\u PATH”)?这看起来像是个语法错误。保罗:谢谢你的提示,这只是一个输入错误。我的源代码在语法上是正确的。是的,其他echo命令也可以工作。正如我在回答中所说的,我认为这是故意的。查看中的
AcceptEnv
选项。该命令接受任何命令列表:然后可以使用顺序命令列表(即用分号代替AND&&control运算符)编写变通方法,例如_channel.setCommand(“导出LD_库路径=\“foo\”echo$LD_库路径”);我不明白这个术语和环境变量的设置有什么关系?你能详细解释一下吗?谢谢