JSCH写入命名管道

时间:2015-03-27 01:27:21

标签: java ssh io named-pipes jsch

我试图通过named pipe促成的连接写信给jsch

        // connect to server
        JSch ssh = new JSch();
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
        System.out.println("Establishing Connection...");
        session.connect();
            System.out.println("Connection established.");
        System.out.println("Crating SFTP Channel.");
        ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
        sftpChannel.connect();
        System.out.println("SFTP Channel created.");

        // write to pipe
        OutputStream strm = sftpChannel.put(remoteFile);

        // failed attempts
        // BufferedWriter wrtr = new BufferedWriter(new PrintWriter(new OutputStreamWriter(strm)));
        // PrintWriter wrtr = new PrintWriter(new BufferedOutputStream(strm));

        // Current version
        BufferedWriter wrtr = new BufferedWriter(new PrintWriter(strm));

        wrtr.write("hello world");
        wrtr.flush();

        session.disconnect();
        sftpChannel.disconnect();
        wrtr.close();

连接到服务器部分基本上是来自SSH connection with Java

的精确副本

代码甚至会等待读取另一端的管道,这意味着如果我不使用:

cat pipe

它会等到我这样做,然后一旦我拥有它就会打印出来并且猫管呼叫将结束。从本质上讲,我似乎将""写入管道,而不是" hello world"

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

我怀疑如果您与任何SFTP服务器软件作者交谈,他会告诉您不支持通过SFTP与命名管道进行交互,而且您自己就是这样。话虽如此,您可以尝试为put操作请求附加模式:

OutputStream strm = sftpChannel.put(remoteFile, ChannelSftp.APPEND);
                                                ^^^^^^^^^^^^^^^^^^
BufferedWriter wrtr = new BufferedWriter(new PrintWriter(strm));
wrtr.write("hello world");

它可能有效,或者可能没有。这取决于SFTP服务器。

在协议级别,SFTP写入请求指定要写入的文件,写入文件的位置以及要写入的数据。基于我手头的OpenSSH 5.8源代码,该版本的SFTP服务器程序将始终在向其写入数据之前寻找文件中的正确位置。管道不支持搜索,因此sftp-server程序会在不尝试写入数据的情况下向客户端报告查找失败。

但是,如果在附加模式下打开文件,则sftp-server的OpenSSH 6.6版本将省略搜索。我没有测试它,但是如果客户端首先请求文件的附加模式,则可以使用该版本的服务器写入命名管道。而且,通过扩展,它也可以用于OpenSSH服务器的其他一些版本。