2

我通过SSHJJScH等 Java API在远程机器上执行命令。我探索了 Java Expect API,例如ExpectItExpect4j。但是我找不到将机器的输出逐行流式传输到我的 java 进程的方法。假设我正在远程机器上的一个大文件上执行 grep,我想逐行将巨大的输出流式传输到我的进程,而不是等待整个命令完成。可能吗 ?如果是这样,怎么办?

4

2 回答 2

0

我希望一旦您将输出流设置为文件,我们就可以做到这一点。在下面的代码中,我的输出流被定向到系统中的“outs.txt”文件。在填充时,您可以创建一个新线程开始处理文件的内容。下面的代码片段显示了如何设置输出流。在此代码片段之后,您必须启动一个线程才能处理“outs.txt”文件的输出。快乐编码!!!

                    ss=new StringBuilder("grep aa.txt");
                    ss.append("\n");
                    FileWriter fw = new FileWriter("comm.txt");
                    BufferedWriter bw = new BufferedWriter(fw);
                    bw.write(ss.toString());
                    bw.flush();
                    fw.close();
                    bw.close();
                    InputStream is=new FileInputStream("comm.txt");
                    OutputStream os=new FileOutputStream("outs.txt");   
                    channel.setInputStream(is);
                    channel.setOutputStream(os);
                    Thread.sleep(1000);
                    channel.connect();
于 2017-04-01T16:56:53.147 回答
0

使用 SSHJ 和 a 从远程主机打开和读取输入流String filename

try (final RemoteFile handle = sftp.open(filename, EnumSet.of(OpenMode.READ));
    final InputStream in = handle.new RemoteFileInputStream();
    final InputStreamReader isr = new InputStreamReader(in);
    final BufferedReader reader = new BufferedReader(isr)) {
    // Do stuff, for example:
    String line;
    while ((line = reader.readLine()) != null) {
        // more stuff
    }
} catch (IOException e) {
    logger.error("Couldn't open SFTP input stream for file: {}", filename, e);
}

如果您正在寻找流式传输命令的输出,它基本上是相同的。

try (Session session = sshClient.startSession();
    final Command command = session.exec("grep temp.txt");
    final InputStreamReader isr = new InputStreamReader(command.getInputStream());
    final BufferedReader reader = new BufferedReader(isr)) {
    // Do stuff, for example:
    String line;
    while ((line = reader.readLine()) != null) {
        // more stuff
    }
} catch (IOException e) {
    logger.error("Couldn't open SFTP input stream for file: {}", filename, e);
}

这应该适用于 Java 8 和任何最新版本的 SSHJ(当前为 0.32.0)。

于 2021-12-09T09:12:16.983 回答