问题描述
我需要用 Java 在远程 SSH 服务器上执行命令。为此,我正在使用 JSch。
命令 1 是在 Linux 机器上设置环境的命令,需要一些时间来执行(大约 20 分钟)。命令 1 是一次性操作。 如果我打开 PuTTY 会话,我只需要执行一次命令 1。
命令 2 依赖于命令 1。没有命令 1,它不会执行。
一旦执行了命令 1(一次操作),命令 2(执行需要 2-3 秒)可以针对不同的实体执行,而无需再次执行命令 1。
我知道我可以使用由 &&
分隔的命令来执行此操作,但是这样执行命令 1 会不必要地降低整体性能。
代码:
String host = "1.1.1.1";
String user = "parag";
String password = "abcdf";
String command1 = "command1";
String command2 = "command2";
try {
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking","no");
JSch jsch = new JSch();
Session session = jsch.getSession(user,host,22);
session.setConfig(config);
session.setPassword(password);
session.connect();
System.out.println("Connected");
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command1 + " && " + command2);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp,1024);
if (i < 0)
break;
System.out.print(new String(tmp,i));
}
if (channel.isClosed()) {
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
session.disconnect();
System.out.println("DONE");
} catch (Exception e) {
e.printstacktrace();
}
如果可能,请告诉我。如果有的话,还建议一个替代方案,以防 JSch 无法做到这一点。
解决方法
你现在拥有的是正确的方法。
如果你真的需要优化它,你必须将命令提供给远程 shell 会话。要么使用“exec”通道显式启动shell。或者直接使用“shell”通道。然后将各个命令写入 shell 输入。
另见:
- Providing input/subcommands to command executed over SSH with JSch
- What is the difference between the 'shell' channel and the 'exec' channel in JSch
- Multiple commands through JSch shell
- JSch Shell channel execute commands one by one testing result before proceeding
强制性警告:不要使用 StrictHostKeyChecking=no
盲目接受所有主机密钥。这是一个安全漏洞。你失去了对 MITM attacks 的保护。有关正确(且安全)的方法,请参阅:How to resolve Java UnknownHostKey,while using JSch SFTP library?