在jsch ChannelExec上设置环境变量

时间:2012-02-20 19:07:07

标签: java ssh jsch

我想在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的隐式解决方案不起作用?

5 个答案:

答案 0 :(得分:3)

对于第二种方式,我认为这是正常的,这是行不通的。虽然SSH客户端可以发送它想要的任何环境变量,但是服务器决定将这些变量传递给目标进程,而忽略它们。通常,服务器配置为仅允许LC_*TERM和类似变量。对于OpenSSH sshd,您可以使用选项AcceptEnvsshd_config中对其进行配置。 (在当前的Ubuntu系统上,默认值为AcceptEnv LANG LC_*。)

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

对于第一种方式,我不知道为什么这不起作用。也许你的bashrc脚本有一些编程,如果不是在交互模式下,或者如果没有连接到终端,立即退出?完整的可重复示例可能对此有所帮助。

答案 1 :(得分:3)

我现在找到了解决方法,但这不是解决方案。我的猜测是,setEnv()在JSch或Open SSH服务器中都是错误的。

解决方法:

_channel.setCommand("export LD_LIBRARY_PATH=\"foo\" && echo $LD_LIBRARY_PATH");

答案 2 :(得分:0)

Acceptenv 设置为要继承的环境变量的名称或模式为我工作。该文件位于/ etc / ssh / sshd_config。

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

AcceptEnv PATH
AcceptENV ORA*

答案 3 :(得分:0)

根据SSH RFC,初始化SSH连接时设置TERM变量。无论AcceptEnv如何,这都是最初设置的。 https://tools.ietf.org/html/rfc4254#section-6.2

像其他人说的那样,为了调用_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;

答案 4 :(得分:0)

你试过吗

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

注意“美元”($)符号前面的“双反斜杠”(\\)。