我试图用SSH协议从服务器读取数据。为此,我使用j2ssh库。我的服务器在ssh中与另一台服务器连接,没有任何问题。问题是当我试图从shell命令行读取任何数据时。无论我发送给"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 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();
}发布于 2020-12-11 11:55:02
如果您的目标是传输文件,则应该使用SFTP客户端。SFTP正是您所要寻找的: SSH之上的文件传输协议。它比在主机上使用一些命令和重定向流要有效得多。
J2SSH有一个可以用SshClient构造的SftpClient实现。只需使用其中一个get方法即可。Javadocs是这里。
在了解到您不试图传输文件后进行编辑:
在启动shell之前,您需要进行请求一个伪终端。从医生那里:
远程进程可能需要伪终端。在执行命令或启动shell之前调用此方法。
另外,由于您似乎使用的是Linux环境,所以我建议使用终端类型"xterm“,而不是使用他们的示例"vt100”。
tail工作而不是其他命令的原因是您正在交互地调用tail。交互式命令创建自己的伪终端。如果您调用tail -n 16 filename.txt,那么您将得到与其他命令相同的结果,因为它不会是交互式的。
https://stackoverflow.com/questions/65250193
复制相似问题