我需要用Java在远程SSH服务器上执行命令。我用的是JSch
A Command 1是在Linux机器上设置环境的命令,需要一些时间来执行(大约20分钟)。命令1为一次性操作。如果我打开一个PuTTY会话,我只需要执行一次Command 1。
命令2依赖于命令1。如果没有Command 1,它不会执行。
命令1执行后(一次性操作),命令2(执行时间2-3秒)可以针对不同的实体执行,而不需要再次执行命令1。
我知道我可以用&&
分隔命令,但是这样的话,Command 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, 0, 1024);
if (i < 0)
break;
System.out.print(new String(tmp, 0, 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输入。
参见:
- 为使用JSch在SSH上执行的命令提供输入/子命令
- 'shell'频道和'execec 'JSch 通道
- 通过JSch shell的多个命令
- JSch Shell通道执行命令前逐一测试结果
必选警告:不要使用StrictHostKeyChecking=no
盲目接受所有主机密钥。这是一个安全漏洞。你失去了对MITM攻击的保护。有关正确(和安全)的方法,请参见:如何解决Java UnknownHostKey,而使用JSch SFTP库?