使用java runtime.exec到ssh时,如何获取该远程计算机的控制台输出?

时间:2011-06-07 17:55:48

标签: java ssh stdout runtime.exec

假设我们有这个方法来为另一台机器制作一个ssh。如何将机器终端的输出返回主机

  public void getSSHreply()
  {
    Process p;

    // Set up the arguments for ProcessBuilder
    String[] cmd = 
    {
        "/usr/bin/ssh", 
        "someRemoteMachine", //This machine will authenticate with keys, hence no pw needed
        "./myprog",
    };

    try
    {
            p = Runtime.getRuntime().exec(cmd);

            //How would I redirect stdout back to host machine?
            StringBuffer s = new StringBuffer();
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

            while (input.readLine() != null) 
            {
                 s.append(input.readLine() + "\n");
            }

            System.out.println(s.toString());


    }
    catch (IOException e)
    {
            System.err.println("Failed to read & or start ");
    }

  }

2 个答案:

答案 0 :(得分:0)

不幸的是你做不到。最简单的方法可能是读取p的inputStream和errorStream(通常在两个独立的线程中)。

我相信您的直接问题是因为您使用的是BufferedReader - 所以当SSH显示“密码:”提示符(没有终止换行符)时,Bufferedreader将不会向您的input.readLine返回任何内容( )打电话。

最简单的方法是一次读取一个字符的输入(当然不是最有效的)。

您也可能想要读取stderr流,这就是为什么您可能需要几个线程。

答案 1 :(得分:0)

Process对象包含获取STDOUTSTDERRSTDIN流的方法。 (例如getOutputStream())。

您可能需要查看commons-exec以便更方便地启动和管理外部程序,其中包含StreamPumper等工具来重定向数据。