首页 > 解决方案 > 如何在 JSch 中设置 Java 主页以执行命令?

问题描述

我正在使用 Jcraft JSch 连接到远程机器并执行命令。由于它是一个非交互式 shell,它没有找到 Java 主页。使用 jsch 时如何设置 Java 主页?看起来像

((ChannelExec) channel).setEnv("LANG", "UTF-8");
((ChannelExec) channel).setEnv("JAVA_HOME", "/blah/java/J8.0_64/");

已弃用?

public String sendCommand(String command) {
  StringBuilder outputBuffer = new StringBuilder();

  try {
     Channel channel = sesConnection.openChannel("exec");
     ((ChannelExec) channel).setEnv("LANG", "UTF-8");
     ((ChannelExec) channel).setEnv("JAVA_HOME", "/blah/java/J8.0_64/");
     ((ChannelExec) channel).setCommand(command);
     InputStream commandOutput = channel.getInputStream();
     channel.connect();
     int readByte = commandOutput.read();

     while (readByte != 0xffffffff) {
        outputBuffer.append((char) readByte);
        readByte = commandOutput.read();
     }

     channel.disconnect();
  } catch (IOException ioX) {
     logWarning(ioX.getMessage());
     return null;
  } catch (JSchException jschX) {
     logWarning(jschX.getMessage());
     return null;
  }

  return outputBuffer.toString();
}

我在执行命令时遇到的错误

JAVA_HOME 未设置,找不到 javac 来推断位置,请设置 JAVA_HOME。

标签: javasshenvironment-variablesjsch

解决方案


ChannelExec.setEnv在 JSch 方面可能有效。但是假设您要连接到 OpenSSH 服务器,则必须明确配置服务器以允许您使用指令LANG设置和JAVA_HOME环境变量。它可能不是什么。AcceptEnv

您可以使用 PuTTY(连接 > 数据 > 环境变量)尝试相同的操作。您可能会收到“服务器拒绝设置环境变量”消息。

另请参阅当我通过传递自定义参数 ssh 登录到我的 Unix 机器时,如何设置环境变量?


无论如何,正确的解决方案是修复您的服务器配置以正确设置环境,即使对于非交互式会话也是如此。

或者作为一种肮脏的解决方法,您可以直接在命令中设置变量:

JAVA_HOME=/blah/java/J8.0_64/; java ...

另请参阅某些 Unix 命令在使用 JSch 通过 Java 执行时失败并显示“... not found”


推荐阅读