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

时间:2012-07-25 15:36:24

标签: java terminal runtime.exec

更具体地说,我真正想做的是打开两个新的终端。从terminal_1我想ssh @ host1并运行program1到host1。从terminal_2我想ssh @ host2并运行program2到host2。我需要在terminal_1上查看program1的输出,并在terminal_2上查看program2的输出。

(我已经设法打开xterm和ssh @ host.I试图传递第二个命令“&& java echo_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();
    }
}

3 个答案:

答案 0 :(得分:0)

我宁愿使用jsch或其他ssh库而不使用终端和执行。

答案 1 :(得分:0)

我立即关注的一个问题是你没有从生成的进程中处理stdout / stderr。如果不这样做,很可能会阻止进程和进程本身的输出。有关详细信息,请参阅this answer

答案 2 :(得分:0)

BufferedReader stdError = .. 

..将被Eclipse标记为警告,因为它似乎没有被再次引用。这反过来表明错误流没有被消耗。这样做。

有关使用Process的更多提示,请参阅runtime.exec info. page中链接的文章。另外,最好使用ProcessBuilder,它可以合并System.outSystem.err,这样可以更容易地使用一个循环来使用它们。

相关问题