3

我想在 jsch的ChannelExec(not ) 中运行远程命令。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

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

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

对于第一种方式,我不知道为什么这不起作用。也许您的 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

根据 SSH RFC,TERM 变量是在初始化 SSH 连接时设置的。这是最初设置的,与 AcceptEnv 无关。 https://www.rfc-editor.org/rfc/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;
于 2014-06-25T14:09:27.243 回答
0

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

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

AcceptEnv PATH
AcceptENV ORA*
于 2012-03-13T10:36:20.893 回答
0

你试过了吗

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

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

于 2017-04-05T01:51:39.273 回答