J2ssh получает пустой входной поток

#java #ssh #inputstream #j2ssh

#java #ssh #входной поток #j2ssh

Вопрос:

Я пытаюсь считывать данные с сервера по протоколу SSH. Для этого я использую библиотеку j2ssh. Мой сервер соединяется с другим сервером по ssh без каких-либо проблем. Проблема возникает, когда я пытаюсь прочитать какие-либо данные из командной строки оболочки. Какую бы «команду» я ни отправлял в программу «read = in.read (buffer)«, она никогда не получала никаких данных, я пробовал с «ls» с «cat filename.txt » и другие команды.

Только одна команда работает нормально и является «tail -f filename.txt «. С помощью этой команды я вижу, что буфер не пуст, он содержит текст файла, но конечная команда не закрывается и во время прослушивания отправляет программу в цикл.

Кто-нибудь может помочь мне узнать, почему я не могу получить какие-либо данные из другой команды?

Это мой код:

  private String exec(String cmd) throws SSHHandlerException {
    String result = null;

    session = ssh.openSessionChannel();

    if(session.startShell())
    {
        session.getOutputStream().write((cmd "n").getBytes());
        session.getOutputStream().close();
        result = read(session,log);
    }
    session.close();
    ssh.disconnect();
    return resu<
}

private static String read(SessionChannelClient session, ProcessLogger log) throws Exception{
    byte buffer[] = new byte[255];
    int read;
    StringBuffer out=new StringBuffer();
    InputStream in = session.getInputStream();

    while((read = in.read(buffer)) > 0) {
        out.append(new String(buffer, 0, read));
    }

    return out.toString();
}
 

Ответ №1:

Если ваша цель — передавать файлы, вместо этого вы должны использовать SFTP-клиент. SFTP — это именно то, что вы ищете: протокол передачи файлов поверх SSH. Это намного, намного эффективнее, чем использовать какую-либо команду на хосте и перенаправлять поток.

J2SSH имеет SftpClient реализацию, которая может быть создана с SshClient помощью . Просто используйте один из get методов. Javadocs здесь.

Отредактируйте, узнав, что вы не пытаетесь передавать файлы:

Перед запуском оболочки необходимо запросить псевдотерминал. Из документов:

Удаленному процессу может потребоваться псевдотерминал. Вызовите этот метод перед выполнением команды или запуском оболочки.

Кроме того, поскольку кажется, что вы используете среду Linux, я бы рекомендовал использовать тип терминала «xterm», а не их пример «vt100».

Причина, по которой tail это работало, а не другие команды, заключалась в том, что вы вызывали tail интерактивно. Интерактивная команда создает свой собственный псевдотерминал. Если вместо этого вы вызовете tail -n 16 filename.txt , вы получите те же результаты, что и с другими командами, потому что он не будет интерактивным.

Комментарии:

1. Спасибо за комментарий. Моя цель — не читать файл, мне нужно прочитать после отправки команды «ответ» оболочки. Сначала я пытаюсь использовать простые команды «ls», «cat» и т. Д., Но я ничего не могу прочитать с помощью этих команд, и я не знаю почему.

2. @Simone о, так ты использовал cat и tail только в качестве примеров команд?