Java 打开新的终端,ssh到远程主机,并运行一个程序到远程主机。所有输出都要在新打开的终端上查看
更具体地说,我真正想做的是打开两个新的终端。从终端_1,我想ssh@host1并运行一个程序1到host1。从terminal_2,我想ssh@host2并运行一个程序2到host2。我需要在终端_1上查看程序1的输出,在终端_2上查看程序2的输出 (我已成功打开xterm和ssh@host。我试图传递第二个命令“&&javaecho_1”,但它什么也没做) 代码如下:Java 打开新的终端,ssh到远程主机,并运行一个程序到远程主机。所有输出都要在新打开的终端上查看,java,terminal,runtime.exec,Java,Terminal,Runtime.exec,更具体地说,我真正想做的是打开两个新的终端。从终端_1,我想ssh@host1并运行一个程序1到host1。从terminal_2,我想ssh@host2并运行一个程序2到host2。我需要在终端_1上查看程序1的输出,在终端_2上查看程序2的输出 (我已成功打开xterm和ssh@host。我试图传递第二个命令“&&javaecho_1”,但它什么也没做) 代码如下: import java.io.*; public class multi1 implements Runnable {
import java.io.*;
public class multi1 implements Runnable {
public void run() {
try {
String ss = null;
Runtime obj = null;
String[] newcmd = new String[]{"/usr/bin/xterm","-hold","-e","ssh andreas@192.168.0.0&&java echo_1"};
Process p = Runtime.getRuntime().exec(newcmd);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((ss = stdInput.readLine()) != null) {
System.out.println(ss);
}
}catch (IOException e) {
System.out.println("FROM CATCH" + e.toString());
}
}
public static void main(String[] args) throws Exception {
Thread th = new Thread(new multi1());
th.start();
//Thread th2 = new Thread(new multi1());
//th2.start();
}
}
我宁愿使用或其他ssh库,而不使用终端和exec。我立即担心的一个问题是,您没有从生成的进程中处理stdout/stderr。如果不这样做,很可能会阻止进程和进程本身的输出。有关更多信息,请参阅
BufferedReader stdError = ..
…将被Eclipse标记为警告,因为它似乎不再被引用。这反过来表明错误流没有被使用。这样做
有关使用
流程的更多提示,请参阅中链接的文章。另外,最好使用一个ProcessBuilder
,它可以合并系统.out
和系统.err
,这样就更容易用一个循环同时使用这两个程序。echo_1是一个将运行很长时间的程序,并在事件到达后提供特定的输出。我需要在本地监视该输出。使用jsch库是否可以实现这一点?感谢使用jsch,您可以连接到SSH并获得输出和输入的流,现在应该是发布的时候了。Hey Aviram,使用jsch完成工作谢谢!我有个问题你可能有解决办法。。如果我执行ls或java javaprogram或./cprogram,in.available大于0,我检索输出,但当我执行程序/usr/local/bin/click_program时,in.available()为0,但输出打印在我的终端上。这怎么可能??为什么我也检索不到该输出?不管jcsh是否太大,in.available都会告诉您当前可以从输入流读取多少数据,如果是0,这并不意味着您稍后将无法获取输入。您应该只读取输入流,直到它结束(就像读取任何其他流一样)。顺便说一句,如果答案有帮助,如果你接受,我将不胜感激。