Intereting Posts
Неожиданное возобновление «имени пакета», хотя уже возобновлено в «имя пакета» Ошибка в Android Когда вызывается метод getView () ListView? File.lastModified () никогда не был установлен с file.setLastModified () Как включить CardView в ViewPager Примеры файлов построения градиентов для ссылки на Crashlytics из проектов приложений и библиотек Как реализовать рекламные объявления с помощью Phonegap? Android: почему setVisibility (View.GONE); Или setVisibility (View.INVISIBLE); не работает Получить размер файла в android sdk? Vector Drawable не может быть правильно загружен в Android API 19 с помощью Support Library (23.4.0) В чем разница между Progressbar и progressDialog? Как изменить цвет и размер текста всплывающего меню в Android? Android – динамическое изменение положения изображения Невозможно запустить службу Google Play на эмуляторе (необходимо обновить сервис Google Play) Android MediaPlayer застрял в режиме подготовки () Не удается обновить событие в календаре телефона от кода

Как запустить и отобразить результат команды оболочки 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?

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

Solutions Collecting From Web of "Как запустить и отобразить результат команды оболочки ssh с помощью 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) } 

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