2015-03-27 5 views
-1

Я пытаюсь написать, чтобы написать 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

Вы сначала попытались сделать то же самое с помощью какого-либо клиента SFTP командной строки? Это может быть сервер SFTP, который вызывает проблемы, а не ваш код. –

+0

Да, я пробовал, что писать на именованный канал с java на сервере в порядке. –

+0

Нет, я имею в виду, если вы попытались написать именованный канал поверх SFTP (удаленно) с помощью SFTP-клиента. –

ответ

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-сервера сообщит о неудаче поиска клиенту, не пытаясь записать данные.

Однако версия sftp-сервера OpenSSH 6.6 опустит поиск, если файл был открыт в режиме добавления. Я не тестировал его, но может быть возможно записать в именованный канал, используя эту версию сервера, если клиент сначала запрашивает режим присоединения к файлу. Кроме того, он может работать и для некоторых других версий сервера OpenSSH.

Смежные вопросы