j2ssh获取空输入流

4ngedf3f  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(381)

我正在尝试用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();
}
polhcujo

polhcujo1#

如果您的目标是传输文件,那么应该改用sftp客户机。sftp正是您想要的:ssh之上的文件传输协议。它比在主机上使用一些命令并重定向流要高效得多。
j2ssh有一个 SftpClient 可以用 SshClient . 就用一个 get 方法。javadocs在这里。

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

在启动shell之前,需要请求一个伪终端。从文档中:
远程进程可能需要一个伪终端。在执行命令或启动shell之前调用此方法。
另外,因为您似乎使用的是linux环境,所以我建议使用终端类型“xterm”,而不是它们的示例“vt100”。
原因是 tail 其他命令都没用是因为你在打电话 tail 以交互方式。interactive命令创建自己的伪终端。如果你打电话 tail -n 16 filename.txt 然后您将得到与其他命令相同的结果,因为它不会是交互式的。

相关问题