Как использовать java runtim.exec для ssh, как получить консольный вывод этой удаленной машины? - PullRequest
0 голосов
/ 07 июня 2011

Скажем, у нас есть этот метод для создания 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 голосов
/ 07 июня 2011

Объект Process имеет методы для получения потоков STDOUT, STDERR и STDIN. (напр. getOutputStream()).

Возможно, вы захотите поискать в commons-exec более удобные способы запуска и управления внешними программами, в которых есть такие инструменты, как StreamPumper для перенаправления данных.

0 голосов
/ 07 июня 2011

К сожалению, вы не можете. Простейшим способом, вероятно, является чтение inputStream и errorStream p (обычно в двух отдельных потоках).

Я полагаю, что ваша непосредственная проблема заключается в том, что вы используете BufferedReader - поэтому, когда SSH отображает приглашение «Password:» (у которого нет завершающей строки), Bufferedreader не будет возвращать что-либо в ваш input.readLine ( ) вызов.

Самое простое - прочитать ввод по одному символу за раз (хотя, конечно, не самый эффективный).

Возможно, вы также захотите прочитать поток stderr, поэтому вам может понадобиться пара потоков.

...