java - J2ssh 获取空输入流
问题描述
我正在尝试使用 SSH 协议从服务器读取数据。为此,我正在使用 j2ssh 库。我的服务器在 ssh 中与另一台服务器连接没有任何问题。问题是当我尝试从 shell 命令行读取任何数据时。无论我向程序“ read = in.read(buffer) ”发送什么“命令”,都不会得到任何数据,我尝试使用“ ls ”和“ cat filename.txt ”和其他命令。
只有一个命令可以正常工作,并且是“ tail -f filename.txt ”。使用这个命令,我可以看到缓冲区不是空的,它包含文件的文本,但是 tail 命令没有关闭并且在监听时,循环发送程序。
谁能帮我知道为什么我无法从其他命令中获取任何数据?
这是我的代码:
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 result;
}
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();
}
解决方案
如果您的目标是传输文件,则应该使用 SFTP 客户端。SFTP 正是您正在寻找的:基于 SSH 的文件传输协议。这比在主机上使用某些命令并重定向流要高效得多。
J2SSH 有一个SftpClient
可以用SshClient
. 只需使用其中一种get
方法。Javadocs 在这里。
在得知您没有尝试传输文件后进行编辑:
在启动 shell 之前,您需要请求一个伪终端。从文档:
远程进程可能需要一个伪终端。在执行命令或启动 shell 之前调用此方法。
另外,因为您使用的是 Linux 环境,所以我建议您使用终端类型“xterm”而不是他们的“vt100”示例。
工作而不是其他命令的原因tail
是因为您正在以tail
交互方式调用。交互式命令创建自己的各种伪终端。相反,如果您调用,tail -n 16 filename.txt
那么您将获得与其他命令相同的结果,因为它不会是交互式的。
推荐阅读
- assembly - movsql 调用导致核心转储
- python - 是否可以简化循环和多个 if 语句检查速度?
- mongodb - 同一集合上的 MongoDB 聚合
- javascript - React.useCallback() 用于链式匿名函数
- swift - 收到错误“变量在其自己的初始值内使用”
- javascript - 传递/传播 event.target 的父元素
- ruby - Smallest substring consisting of maximum distinct characters of a String
- wordpress-theming - Custom Wordpress Theme don't break the paragraph
- python - 将命令行参数传递给 python 单元测试
- filter - How do successive convolutional layers work?