使用 JSch

问题描述

我需要用 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 输入。

另见:


强制性警告:不要使用 StrictHostKeyChecking=no 盲目接受所有主机密钥。这是一个安全漏洞。你失去了对 MITM attacks 的保护。有关正确(且安全)的方法,请参阅:How to resolve Java UnknownHostKey,while using JSch SFTP library?