我通过SSHJ和JScH等 Java API在远程机器上执行命令。我探索了 Java Expect API,例如ExpectIt和Expect4j。但是我找不到将机器的输出逐行流式传输到我的 java 进程的方法。假设我正在远程机器上的一个大文件上执行 grep,我想逐行将巨大的输出流式传输到我的进程,而不是等待整个命令完成。可能吗 ?如果是这样,怎么办?
问问题
668 次
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 回答