#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 только в качестве примеров команд?