Java 在jsch ChannelExec上设置环境变量
我想在jsch中的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
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_库路径”);我不明白这个术语和环境变量的设置有什么关系?你能详细解释一下吗?谢谢