Intereting Posts

Как запустить и отобразить результат команды оболочки ssh с помощью JSch?

Я пытаюсь использовать библиотеку JSch – Java Secure Channel делает ssh-соединение в моем приложении для Android, он работает.

Теперь я хотел бы выполнить команду и получить результат.

Я попробовал несколько методов, которые лучше всего работают. Однако этот метод работает только частично, потому что по какой-то причине я не могу объяснить, моя программа останавливается в конце моего цикла while, но я результат команды, которая появляется в моем журнале.

Вот мой код:

public static String executeRemoteCommand(String username, String password, String hostname, int port) throws Exception { JSch jsch = new JSch(); Session session = jsch.getSession(username, hostname, port); session.setPassword(password); // Avoid asking for key confirmation Properties prop = new Properties(); prop.put("StrictHostKeyChecking", "no"); session.setConfig(prop); session.connect(); Channel channel = session.openChannel("shell"); channel.connect(); DataInputStream dataIn = new DataInputStream(channel.getInputStream()); DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream()); // send ls command to the server dataOut.writeBytes("ls\r\n"); dataOut.flush(); // and print the response String line = dataIn.readLine(); String result = line + "\n"; while ((line = dataIn.readLine()) != null) { result += line + "\n"; Log.i("TAG", "Line: "+line); } dataIn.close(); dataOut.close(); channel.disconnect(); session.disconnect(); return result; } 

У кого-нибудь еще есть лучший способ запустить командную строку с JSch?

Заранее спасибо !

Ваш метод останавливается в цикле (вместо его завершения), потому что удаленная оболочка не закрывает выходной поток. У этого нет причин для этого, так как там вы можете отправить больше команд.

Если вы хотите выполнить только одну команду (или ряд известных ранее команд), вы не должны использовать канал «Шелл», а канал «exec».

Таким образом удаленная оболочка (которая выполняет вашу команду) завершит выполнение вашей команды, а затем сервер закроет поток. Таким образом, ваш цикл завершится, а затем вы сможете закрыть потоки.

Если вы считаете, что вам нужен канал оболочки (например, если вам нужно запустить несколько команд в том же контексте и отреагировать на выход, прежде чем принимать решение о том, что будет следующим), вам нужно будет узнать, когда один (Например, путем распознавания подсказки), а затем отправить следующую команду. Чтобы завершить работу, либо закройте выходной поток, либо отправьте команду «выход из системы» или «выйти» (как для любой стандартной оболочки unix, так и для других оболочек могут потребоваться разные команды), тогда удаленный сайт также должен закрыть другой поток.

Кстати, при отключении строгой проверки ключа хоста это также открывает ваше соединение с атакой «человек в середине», а в случае аутентификации пароля злоумышленник может захватить ваш пароль. Правильный способ сделать это – настроить правильно инициализированный репозиторий ключей хоста для распознавания ключа удаленного хоста.

Насколько мне известно, JSch – единственный реальный вариант.

Я обнаружил, что ошибки Jsch, как правило, требуют некоторого рытья. Но в первую очередь вам захочется поймать и распечатать ошибки как минимум.

 try{ JSch jsch = new JSch(); Session session = jsch.getSession(username, hostname, port); ... omitted } catch (Exception e) { System.out.println(e) } 

Также посмотрите пример кода на сайте