我如何通过 Jsch 获得 $JAVA_HOME

How do I get $JAVA_HOME by Jsch

#!/bin/sh
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
echo JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
echo JAVA_HOME=$JAVA_HOME
${JAVA_HOME}/bin/java -jar xxxxx

我想在 jsch 中的远程机器上执行这个脚本:

public boolean actionShell(Session sshSession, String command) {
        boolean flag = false;
        Channel channel = null;
            try {
            channel = sshSession.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);
            channel.setInputStream(null);
            ((ChannelExec) channel).setErrStream(System.err);
            InputStream in = channel.getInputStream();
            channel.connect();

            while (true) {
                 if (channel.isClosed()) {
                     if (in.available() > 0) continue;
                         flag = channel.getExitStatus() == 0 ? true : false;
                         log.info("exit-status: " + flag);
                         break;
                     }
                     Thread.sleep(1000);
                }
            } catch (Exception e) {
                log.error("error", e.getMessage());
            } finally {
                if (channel != null || channel.isConnected())
                    channel.disconnect();
            }
            return flag;
        }

结果显示此sh脚本无法获取JAVA_HOME的值

JAVA_HOME=
JAVA_HOME=
/bin/java -jar xxxxx

由于没有获取远程matchine的conf,所以无法指出JAVA_HOME.

我猜你应该在 OS 上设置 JAVA_HOME 变量。你试过了吗?

如果远程机器没有在远程环境中设置 $JAVA_HOME,那么(很明显)当你得到它时它将是空的。

因此,您需要:

  • 更改远程机器的远程 shell 初始化以设置适当的 $JAVA_HOME 或
  • 在您 运行 或
  • 的脚本中传递适当的 $JAVA_HOME 设置
  • 编写一个聪明的 shell 函数,可以 "intuit" 适当的 $JAVA_HOME 设置;例如通过查看可能安装了 JRE 的不同位置。

我们可以获得非交互和非登录 shell 并将此代码插入脚本中:

#!/bin/bash . /etc/profile . ~/.profile

非交互和非登录 shell 不会查找和加载 "BASH_ENV"。有一个图像显示文件加载的差异。

enter image description here

Jsch的session环境没有/etc/profile配置...可以先执行[source /etc/profile;]加载配置。然后,您可以成功执行任何应用程序....