首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >J2ssh获得空输入流

J2ssh获得空输入流
EN

Stack Overflow用户
提问于 2020-12-11 11:07:21
回答 1查看 111关注 0票数 0

我试图用SSH协议从服务器读取数据。为此,我使用j2ssh库。我的服务器在ssh中与另一台服务器连接,没有任何问题。问题是当我试图从shell命令行读取任何数据时。无论我发送给"read = in.read(buffer)“的”命令“是什么,我都不会获得任何数据,我尝试使用"ls”和"cat filename.txt“等命令。

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

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

这是我的密码:

代码语言:javascript
复制
 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();
}
EN

回答 1

Stack Overflow用户

发布于 2020-12-11 11:55:02

如果您的目标是传输文件,则应该使用SFTP客户端。SFTP正是您所要寻找的: SSH之上的文件传输协议。它比在主机上使用一些命令和重定向流要有效得多。

J2SSH有一个可以用SshClient构造的SftpClient实现。只需使用其中一个get方法即可。Javadocs是这里

在了解到您不试图传输文件后进行编辑:

在启动shell之前,您需要进行请求一个伪终端。从医生那里:

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65250193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档