Java 打开新的终端,ssh到远程主机,并运行一个程序到远程主机。所有输出都要在新打开的终端上查看

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 {

更具体地说,我真正想做的是打开两个新的终端。从终端_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 {

    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,这并不意味着您稍后将无法获取输入。您应该只读取输入流,直到它结束(就像读取任何其他流一样)。顺便说一句,如果答案有帮助,如果你接受,我将不胜感激。