Выполнение команды SSH из Java отправляет код состояния 255, но в терминале, если он работает

Я пытаюсь разработать небольшое приложение, которое позволяет мне отправлять определенные команды по SSH на удаленный сервер. Если я попробую это с терминала Linux или из командной строки Windows, он работает без проблем, но когда я делаю это из своего приложения Java, он всегда отвечает кодом состояния 255.

Я отключил брандмауэр и изменил порт, где я слушаю SSH на сервере, на 22, потому что я использую другой, но ничего не работает. Он не выдает мне исключений или чего-то еще, и если он подключается без проблем. Любые идеи?

Я пробовал с sshj и JSch, и с обеими у меня одна и та же проблема.

ФорвардАгент выключен

пример sshj

private void sshj() throws Exception {
    SSHClient ssh = new SSHClient();
    ssh.addHostKeyVerifier((s, i, publicKey) -> true);
    ssh.connect("host", 22);
    Session session = null;
    try {
        ssh.authPassword("username", "password");
        session = ssh.startSession();
        Session.Command cmd = session.exec("command");
        System.out.println(IOUtils.readFully(cmd.getInputStream()).toString());
        cmd.join(5, TimeUnit.SECONDS);
        System.out.println("Exit status: " + cmd.getExitStatus());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }

        ssh.disconnect();
    }
}

Пример JSch

private static void jsch() throws Exception {
    JSch js = new JSch();
    Session s = js.getSession("username", "host", 22);
    s.setPassword("password");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("exec");
    ChannelExec ce = (ChannelExec) c;
    ce.setCommand("command");
    ce.connect();

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    ce.disconnect();
    s.disconnect();

    System.out.println("Exit status: " + ce.getExitStatus());
}

person E. Betanzos    schedule 21.11.2018    source источник
comment
Используйте ce.getErrStream() для просмотра сообщений об ошибках.   -  person Martin Prikryl    schedule 21.11.2018


Ответы (1)


измените код, чтобы получить inputStream перед выполнением connect

InputStream in = ce.getInputStream();
ce.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

Кроме того, getSession неправильно, как и должно быть

public Session getSession(String username,
                      String host,
                      int port)

изменить

Код ниже работает для меня

JSch js = new JSch();
Session s = js.getSession("username", "127.0.0.1", 22);
s.setPassword("password");
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
s.setConfig(config);
s.connect();

Channel c = s.openChannel("exec");
ChannelExec ce = (ChannelExec) c;
ce.setCommand("uptime");

InputStream in = ce.getInputStream();
ce.connect();

BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
      System.out.println(line);
}

ce.disconnect();
s.disconnect();

System.out.println("Exit status: " + ce.getExitStatus());

вывод

 10:26:08 up 149 days, 58 min,  3 users,  load average: 0.61, 0.68, 0.68
Exit status: 0
person Scary Wombat    schedule 21.11.2018
comment
Нет работы, такое же поведение. - person E. Betanzos; 21.11.2018
comment
Я сделал больше правок, также я предполагаю, что это заменено настоящим command ce.setCommand("command"); - person Scary Wombat; 21.11.2018
comment
У меня есть вызов getSession в моем коде, как и у вас. Это была ошибка перевода. Да, я заменяю command реальной командой, и в терминале все работает нормально, но в моем коде нет. - person E. Betanzos; 21.11.2018
comment
посмотри мое последнее редактирование - person Scary Wombat; 21.11.2018
comment
Хм, мистер Бетансос ушел? - person Scary Wombat; 21.11.2018