【问题标题】:Open new terminal, ssh to remote host and run a program to the remote host.All output to be viewed on new opened terminal打开新终端,ssh 到远程主机并在远程主机上运行程序。所有输出都将在新打开的终端上查看
【发布时间】:2012-07-25 15:36:24
【问题描述】:

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

(我已成功打开 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();
    }
}

【问题讨论】:

    标签: java terminal runtime.exec


    【解决方案1】:

    我宁愿使用jsch 或其他 ssh 库,并且无需终端和执行。

    【讨论】:

    • echo_1 是一个程序,它将运行很长时间,并在事件到达后给出特定的输出。我需要在本地监视该输出。 jsch库有可能吗?谢谢
    • 使用 jsch,您可以连接 SSH 并获取要输出和输入的流,这应该是个问题了
    • 嘿 Aviram,使用 jsch 完成工作,谢谢!我有一个问题你可能有解决方案。如果我执行 ls 或 java javaprogram 或 ./cprogram,in.available 为 >0 并且我检索输出,但是当我执行程序 /usr/local/bin/click_program 时, in.available() 为 0,但输出打印在我的终端上。这怎么可能??为什么我也无法检索该输出?
    • 不管 jcsh,in.available 告诉你当前可以从输入流中读取多少,如果它为 0 并不意味着稍后你不会得到输入。您应该只读取输入流直到它结束(当您读取任何其他流时)。顺便说一句,如果答案有帮助,如果您接受,我将不胜感激。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      BufferedReader stdError = .. 
      

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

      有关使用Process 的更多提示,请参阅runtime.exec info. page 中链接的文章。另外,最好使用ProcessBuilder,它可以合并System.outSystem.err,更容易一次循环消耗两者。

      【讨论】:

        猜你喜欢
        • 2013-10-31
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-15
        • 2021-06-09
        相关资源
        最近更新 更多