我试图通过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"
非常感谢任何帮助,谢谢。
答案 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服务器的其他一些版本。