【问题标题】:J2ssh get empty input streamJ2ssh 获取空输入流
【发布时间】:2021-03-22 19:13:12
【问题描述】:

我正在尝试使用 SSH 协议从服务器读取数据。为此,我正在使用 j2ssh 库。我的服务器在 ssh 中与另一台服务器连接没有任何问题。问题是当我尝试从 shell 命令行读取任何数据时。无论我向程序“read = in.read(buffer)”发送什么“命令”,都不会得到任何数据,我尝试使用“ls”和“cat 文件名” .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();
}

【问题讨论】:

    标签: java ssh inputstream j2ssh


    【解决方案1】:

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

    J2SSH 有一个SftpClient 实现,可以用SshClient 构建。只需使用get 方法之一。 Javadocs 是here

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

    在启动 shell 之前,您需要 request a pseudo-terminal。来自文档:

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

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

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

    【讨论】:

    • 感谢您的评论。我的目标不是读取文件,我需要在发送命令后读取外壳“响应”。我首先尝试使用简单的命令“ls”、“cat”等,但我无法使用这些命令读取任何内容,也不知道为什么。
    • @Simone 哦,所以你只使用 cat 和 tail 作为命令示例?
    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2020-07-09
    • 2018-04-07
    • 1970-01-01
    • 2018-01-18
    • 2012-06-28
    相关资源
    最近更新 更多