首页 > 解决方案 > 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();
}

标签: javasshinputstreamj2ssh

解决方案


如果您的目标是传输文件,则应该使用 SFTP 客户端。SFTP 正是您正在寻找的:基于 SSH 的文件传输协议。这比在主机上使用某些命令并重定向流要高效得多。

J2SSH 有一个SftpClient可以用SshClient. 只需使用其中一种get方法。Javadocs 在这里

在得知您没有尝试传输文件后进行编辑:

在启动 shell 之前,您需要请求一个伪终端。从文档:

远程进程可能需要一个伪终端。在执行命令或启动 shell 之前调用此方法。

另外,因为您使用的是 Linux 环境,所以我建议您使用终端类型“xterm”而不是他们的“vt100”示例。

工作而不是其他命令的原因tail是因为您正在以tail 交互方式调用。交互式命令创建自己的各种伪终端。相反,如果您调用,tail -n 16 filename.txt那么您将获得与其他命令相同的结果,因为它不会是交互式的。


推荐阅读