Могу ли я использовать Jsch для подделки ssh-соединения с локальным хостом? - PullRequest
0 голосов
/ 18 августа 2011

Я потратил много времени на разработку приложения, которое будет использовать JSch и подключаться к удаленной машине через ssh для выполнения некоторых операций командной строки. Однако я узнал, что эти операции могут выполняться и на локальном хосте (мое приложение работает на локальном хосте). Теперь ... мне лень переписывать весь код и, честно говоря, я чувствую себя плохо, потому что я действительно привязался к JSch. Есть ли способ обмануть JSch, чтобы он вместо этого подключился к localhost или каким-то образом сказал ему просто использовать localhost, хотя код говорит об обратном? :)

P.S. в случае, если это невозможно, почему обычный класс Proccess не поддерживает setOutputStream и setErrStream, как это делает JSch, а только getInputStream и getErrorStream ??

1 Ответ

4 голосов
/ 18 августа 2011

Пока на вашем локальном компьютере работает SSH-сервер (а ваше приложение имеет необходимые учетные данные для входа), вы также можете использовать JSch для подключения к локальному компьютеру - просто укажите localhost (или 127.0.0.1) какимя хоста для соединения.

Это будет иметь некоторые издержки, так как вы шифруете и дешифруете все данные, что на самом деле не является необходимым для выполнения некоторой команды локально.(С другой стороны, это позволит вам запускать команды от имени другого пользователя, для которого в противном случае вам понадобится что-то вроде sudo или su, или RunAs под Windows.)

JSch реализуетsetOutputStream и setErrStream поверх соответствующих get... методов - он использует что-то подобное внутреннему PipedInputStream и отдельный поток, который перемещает данные между этими потоками.

Поскольку JSch является открытым исходным кодом,вы можете просто посмотреть, как это делается (в классе Channel, если я правильно помню), и скопировать соответствующие методы в ваш класс, который делает то же самое для Process.

Есть ли способ сказать JSch не шифровать данные?

Вы можете использовать шифр none, например, без шифрования.По умолчанию это отключено на всех клиентах и ​​серверах общего назначения (так как это устраняет половину цели SSH), но при правильной конфигурации вы можете включить его.В JSch вы можете использовать

session.setConfig("cipher.s2c", "none,...");  // server to client
session.setConfig("cipher.c2s", "none,...");  // client to server

(Этот параметр конфигурации является списком всех параметров, поддерживаемых клиентом - см. документацию setConfig для всех поддерживаемых значений. Сервер обычно будетвыберите первый из этого списка, который он также поддерживает. Чтобы не шифровать (или отменять соединение), укажите только none.)

Я не знаю, как включить это на сервере SSH -прочитайте документацию вашего сервера.(И включите его только для localhost, если это возможно.)

Рекомендуемый способ его использования - переключаться на шифр none только после аутентификации (чтобы аутентификация все еще была зашифрована), но для localhost это можетне будет необходимости.(Вы можете использовать session.rekey() для переключения шифра (и ключа) после изменения конфигурации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...