【问题标题】:Setting environment variables on a jsch ChannelExec在 jsch ChannelExec 上设置环境变量
【发布时间】:2017-05-18 22:13:23
【问题描述】:

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

【问题讨论】:

  • 您真的在使用_channel.setEnv("LD_LIBRARY_PATH" = "/my/add/path:$LD_LIBRARY_PATH"); 吗?这看起来像一个语法错误。
  • Paulo:感谢您的提示,这只是此条目中的输入错误。我的源代码在语法上是正确的。
  • 是的,其他 echo 命令也可以。

标签: java ssh jsch


【解决方案1】:

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

解决方法:

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

【讨论】:

  • 正如我在回答中所说,我认为这是故意的。查看sshd_config 中的AcceptEnv 选项。
  • 该命令接受任何命令列表:然后可以使用顺序命令列表(即用分号代替 AND && 控制运算符)编写解决方法,例如 _channel.setCommand("export LD_LIBRARY_PATH=\"foo\"; echo $LD_LIBRARY_PATH");
【解决方案2】:

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

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

对于第一种方式,我不知道为什么这不起作用。也许您的 bashrc 脚本中有一些程序可以在未处于交互模式或未连接到终端时立即退出?一个完整的可重现示例可能会有所帮助。

【讨论】:

    【解决方案3】:

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

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

    AcceptEnv PATH
    AcceptENV ORA*
    

    【讨论】:

      【解决方案4】:

      根据 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;
      

      【讨论】:

      • 我不明白 TERM 与环境变量的设置有什么关系?你能详细解释一下吗?谢谢
      【解决方案5】:

      你试过了吗

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

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

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 1970-01-01
        • 2012-10-01
        • 2023-03-13
        • 2012-03-07
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        相关资源
        最近更新 更多