0

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

(我设法打开了 xterm 和 ssh @host。我试图传递第二个命令“&&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();
    }
}
4

3 回答 3

0

我宁愿使用jsch或其他 ssh 库,并且不使用终端和 exec。

于 2012-07-25T15:38:12.123 回答
0

我立即担心的一个问题是您没有从生成的进程中处理标准输出/标准错误。如果你不这样做,你很可能会阻塞进程和进程本身的输出。有关更多信息,请参阅此答案

于 2012-07-25T15:49:01.583 回答
0
BufferedReader stdError = .. 

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

有关使用 的更多提示,请参阅runtime.exec 信息Process中链接的文章。。此外,最好使用 a ProcessBuilder,它可以合并System.outand System.err,从而更容易通过一个循环来使用两者。

于 2012-07-26T10:02:37.527 回答