我正在尝试用ssh协议从服务器读取数据。为此,我使用j2ssh库。我的服务器通过ssh与另一个服务器连接,没有任何问题。问题是当我试图从shell命令行读取任何数据时。无论我向程序“read=in.read(buffer)”发送什么“command”都不会得到任何数据,我尝试使用带有“cat filename.txt”的“ls”和其他命令。
只有一个命令工作正常,是“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();
}
1条答案
按热度按时间polhcujo1#
如果您的目标是传输文件,那么应该改用sftp客户机。sftp正是您想要的:ssh之上的文件传输协议。它比在主机上使用一些命令并重定向流要高效得多。
j2ssh有一个
SftpClient
可以用SshClient
. 就用一个get
方法。javadocs在这里。在得知您不尝试传输文件后进行编辑:
在启动shell之前,需要请求一个伪终端。从文档中:
远程进程可能需要一个伪终端。在执行命令或启动shell之前调用此方法。
另外,因为您似乎使用的是linux环境,所以我建议使用终端类型“xterm”,而不是它们的示例“vt100”。
原因是
tail
其他命令都没用是因为你在打电话tail
以交互方式。interactive命令创建自己的伪终端。如果你打电话tail -n 16 filename.txt
然后您将得到与其他命令相同的结果,因为它不会是交互式的。