Невозможно выполнить команду на сервере, используя j2ssh
Я подключился к серверу Unix через ssh и попытался выполнить команду "ls" и получить ее вывод. Код такой
SessionChannelClient session = client.openSessionChannel();
session.startShell();
String cmd = "ls -l";
session.executeCommand(cmd);
ChannelInputStream in = session.getInputStream();
ChannelOutputStream out = session.getOutputStream();
IOStreamConnector input = new IOStreamConnector(System.in, session.getOutputStream());
IOStreamConnector output = new IOStreamConnector(session.getInputStream(), System.out);
После запуска я не получил никакого вывода в лог-файл. Я обнаружил, что запрос канала не работает, как показано
1019 [main] INFO com.sshtools.j2ssh.connection.ConnectionProtocol - Запрос канала выполнен успешно 1020 [main] INFO com.sshtools.j2ssh.session.SessionChannelClient - Запрос на выполнение команды 1021 [main] INFO com.sshtools.j2ssh.session.SentChanC - Команда ls -l 1021 [main] INFO com.sshtools.j2ssh.connection.ConnectionProtocol - Отправка запроса exec для сеансового канала 1021 [main] INFO com.sshtools.j2ssh.transport.TransportProtocolCommon - Отправка SSH_MSG_CHANNEL_REQUEST INFO 1021 [main] com.sshtools.j2ssh.connection.ConnectionProtocol - Ожидание ответа на запрос канала 1032 [Транспортный протокол 1] INFO com.sshtools.j2ssh.transport.TransportProtocolCommon - Получено SSH_MSG_CHANNEL_EXTENDED_DATA 1033 [ssh-соединение 1]. Сервис - Маршрутизация SSH_MSG_CHANNEL_EXTENDED_DATA 1033 [ssh-connection 1] DEBUG com.sshtools.j2ssh.transport.Service - Завершена обработка SSH_MSG_CHANNEL_EXTENDED_DATA 1075 [Транспортный протокол 1] INFO com.sshtools.j2ssht. ansport.TransportProtocolCommon - Получено SSH_MSG_CHANNEL_FAILURE 1075 [main] INFO com.sshtools.j2ssh.connection.ConnectionProtocol - Ошибка запроса канала
Почему это происходит?
1 ответ
Ты можешь использовать startShell
или же executeCommand
, но не оба.
executeCommand
предназначен только для вызова определенной оболочки по вашему выбору, например /bin/bash. В большинстве случаев вы можете просто использовать startShell
запустить оболочку по умолчанию.
Это все, что вам нужно для выполнения предоставленной вами команды:
final String cmd = "ls -l" + '\n';
session.startShell();
session.getOutputStream().write(cmd.getBytes());
Или, альтернативно, используя executeCommand:
final String cmd = "ls -l";
session.executeCommand(String.format("sh -c \"%s\"", cmd));
Вы можете подключиться к stdout & stderr InputStream
Таким же образом, чтобы увидеть результат вашей команды. Кроме того, обратите внимание, что SessionChannelClient
может обрабатывать только одну команду. Вам нужно будет создать еще один экземпляр для отправки второй команды.
Я предлагаю вам скачать документацию J2SSH. Внутри вы найдете j2ssh-Getting-Start.htm, который объясняет основные операции API.