Неполный inputStream из plink под процессом Java - PullRequest
0 голосов
/ 11 июня 2018

Мой вопрос связан с использованием plink.exe в качестве процесса Java.

Это внутри метода run () потока:

Runtime r = Runtime.getRuntime();
Process p = r.exec("plink -ssh " + target_ip_address);

InputStream in = p.getInputStream();
OutputStream out = p.getOutputStream();

Этот код находится внутри бесконечного времениloop

// Wait until "in" has bytes available 
while ( !(in.available() > 0) ) {
  // Here I have some code that will break out of the while after 10 seconds.
// I use Thread.sleep( 100 ) and count the number of times it gets called
}

StringBuilder response = new StringBuilder();
int responseByte = 0;

while ( in.available() > 0 ) {
  responseByte = in.read();
  response.append( (char) responseByte );
}

Вот две мои проблемы:

  • Если ключ хоста сервера не кэшируется в реестре, в командной строке NORMAL Windows я получусообщение с просьбой сохранить этот ключ в кеше.В Java «in» НИКОГДА не получает это сообщение, почему?

  • Как проверить, что пароль неверный?Позвольте мне объяснить немного лучше ...

Чтобы проверить, могу ли я отправить имя пользователя, пароль или любую команду, я делаю:

if ( response.contains("login as: ") ){
  out.write( username + "\r\n".getBytes() );
  out.flush();
}
else if ( response.contains("password: ") ) {
  out.write( password + "\r\n".getBytes() );
  out.flush();
}

Еслипароль неверный, в командной строке Windows я получаю сообщение об отказе в доступе, но в Java Process InputStream "in" я этого не получаю.Почему это происходит?

Вот пример действия командной строки Windows:

E:\path\to\plink>plink -ssh 128.128.128.128
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
If you trust this host, enter "y" to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter "n".
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) n
login as: username
username@128.128.128.128's password:
Access denied
username@128.128.128.128's password:

Итак, я подумал, что InputStream Java-процесса должен получить и ключевое сообщение, иДоступ запрещен, но их нет.

Кстати, я тоже пытался посмотреть поток ошибок

InputStream err = p.getErrorStream();

и делать то же самое, что я делал для «в», но НИЧЕГО тамлибо.

Есть ли способ заставить эти два сообщения отображаться во входном потоке Процесса?

Любая помощь очень ценится!Большое спасибо!

1 Ответ

0 голосов
/ 12 июня 2018

Извините за ответ на мой собственный вопрос, но я обнаружил проблему ...

Оказывается, что Поток ошибок действительно, получает и сообщение с ключом ssh, исообщения «Доступ запрещен», однако сообщения «Доступ запрещен» принимаются после ВСЕХ неудачных попыток авторизации, и соединение закрывается.

Я решил это, просто отправив пароль, пока соединение не будет закрыто.Я знаю, что это очень плохое решение, но я начну переносить код для использования JSch, поскольку Martin Prikryl предложил

Спасибо и извините за неудобства!

...