Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java J2ssh获取空的输入流_Java_Ssh_Inputstream_J2ssh - Fatal编程技术网

Java J2ssh获取空的输入流

Java J2ssh获取空的输入流,java,ssh,inputstream,j2ssh,Java,Ssh,Inputstream,J2ssh,我正在尝试使用SSH协议从服务器读取数据。为此,我使用j2ssh库。我的服务器通过ssh与其他服务器连接,没有任何问题。问题是当我试图从shell命令行读取任何数据时。无论我发送给程序“read=in.read(buffer)”的是什么“命令”,都不会得到任何数据,我尝试了“ls”和“cat filename.txt”以及其他命令 只有一个命令可以正常工作,即“tail-f filename.txt”。使用这个命令,我可以看到缓冲区不是空的,它包含文件的文本,但是tail命令不关闭,并且在侦听时

我正在尝试使用SSH协议从服务器读取数据。为此,我使用j2ssh库。我的服务器通过ssh与其他服务器连接,没有任何问题。问题是当我试图从shell命令行读取任何数据时。无论我发送给程序“read=in.read(buffer)”的是什么“命令”,都不会得到任何数据,我尝试了“ls”和“cat filename.txt”以及其他命令

只有一个命令可以正常工作,即“tail-f filename.txt”。使用这个命令,我可以看到缓冲区不是空的,它包含文件的文本,但是tail命令不关闭,并且在侦听时,在循环中发送程序

有人能帮我知道为什么我不能从othere命令获取任何数据吗

这是我的代码:

 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();
}

如果您的目标是传输文件,那么应该改用SFTP客户端。SFTP正是您想要的:SSH之上的文件传输协议。这比在主机上使用一些命令并重定向流要有效得多

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

了解到您不尝试传输文件后进行编辑: 在启动外壳之前,您需要执行以下操作。从文档中:

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

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


tail
起作用而其他命令不起作用的原因是您以交互方式调用了
tail
。interactive命令创建自己的伪终端。相反,如果您调用
tail-n16 filename.txt
,那么您将得到与其他命令相同的结果,因为它不会是交互式的。

谢谢您的评论。我的目标不是读取文件,我需要读取send命令之后的shell“response”。我第一次尝试使用简单的命令“ls”、“cat”等,但我不能用这些命令阅读任何东西,我也不知道为什么。@Simone哦,那么你只使用cat和tail作为命令的示例?@Simone查看我的更新答案。