我如何通过 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;
]加载配置。然后,您可以成功执行任何应用程序....
#!/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;
]加载配置。然后,您可以成功执行任何应用程序....