2015-05-22 3 views
0

Я хочу передать файл через SFTP. Я нашел аналогичный вопрос, заданный от how to transfer a file through SFTP in java?. Я опробовал предложенное решение из сообщения на localhost. но я получаю следующую ошибку, показанную при выходе.файл передачи через SFTP

выход

preparing the host information for sftp. 
Host connected. 
sftp channel opened and connected. 
2: No such file 
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846) 
at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2340) 
at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:342) 
at ScpTo.main(ScpTo.java:69) 
File transfered successfully to host. 
sftp Channel exited. 
Channel disconnected. 
Host Session disconnected. 

Код

import java.io.File; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelSftp; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.JSchException; 
import com.jcraft.jsch.Session; 
import com.jcraft.jsch.SftpException; 

public class ScpTo { 

    /** 
    * 
    */ 
    public ScpTo() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String SFTPHOST = "192.168.1.3"; 
      int SFTPPORT = 22; 
      String SFTPUSER = "sam-PC"; 
      String SFTPPASS = ""; 
      String SFTPWORKINGDIR = "C:/Users/sam/Desktop/hi.txt"; 

      Session session = null; 
      Channel channel = null; 
      ChannelSftp channelSftp = null; 
      System.out.println("preparing the host information for sftp."); 

       JSch jsch = new JSch(); 
       try { 
        session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT); 
       } catch (JSchException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       session.setPassword(SFTPPASS); 
       java.util.Properties config = new java.util.Properties(); 
       config.put("StrictHostKeyChecking", "no"); 
       session.setConfig(config); 
       try { 
        session.connect(); 
       } catch (JSchException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       System.out.println("Host connected."); 
       try { 
        channel = session.openChannel("sftp"); 
       } catch (JSchException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       try { 
        channel.connect(); 
       } catch (JSchException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       System.out.println("sftp channel opened and connected."); 
       channelSftp = (ChannelSftp) channel; 
       try { 
        channelSftp.cd(SFTPWORKINGDIR); 
       } catch (SftpException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       File f = new File(SFTPWORKINGDIR); 
       try { 
        channelSftp.put(new FileInputStream(f), f.getName()); 
       } catch (FileNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (SftpException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       System.out.println("File transfered successfully to host."); 


       channelSftp.exit(); 
       System.out.println("sftp Channel exited."); 
       channel.disconnect(); 
       System.out.println("Channel disconnected."); 
       session.disconnect(); 
       System.out.println("Host Session disconnected."); 

    } 
} 
+1

Начните с ** не ** перехватывая все исключения сразу. Знайте, что вы пытаетесь сделать, сушите проблему, прежде чем обращаться за помощью. – zubergu

+0

сообщение обновлено. Кажется, что это проблема с \t \t \t \t \t \t session.connect(); – user2211678

+1

Вы начали сервер? Попробуйте запустить 'netstat -ano' и проверьте, есть ли процесс, прослушивающий порт 22. – longhua

ответ

2

Стек-трассировка показывает, что ошибка произошла во время выполнения команды кд. Ошибка «нет такого файла», что, вероятно, фактически означает «нет такой директории», поэтому проблема почти наверняка заключается в том, что каталог, определенный SFTPWORKINGDIR, не существует.

Я не обвиняю вас в том, что вы смущены. Этот API, похоже, адски усложнен. Я один из разработчиков edtFTPj/PRO, который предлагает гораздо более простой интерфейс. Например, вот код, чтобы загрузить файл через SFTP:

SecureFileTransferClient client = new SecureFileTransferClient(); 
client.setProtocol(Protocol.SFTP); 
client.setRemoteHost("myserver.com"); 
client.setUserName("myusername"); 
client.setPassword("mypassword"); 
client.connect(); 
client.downloadFile("filename.txt", "filename.txt"); 
client.disconnect(); 

Обратите внимание, что edtFTPj/PRO не является бесплатным продуктом.

1
String SFTPWORKINGDIR = "C:/Users/sam/Desktop/hi.txt"; 
... 
channelSftp.cd(SFTPWORKINGDIR); 

Начнем с того, SFTPWORKINGDIR появляется сослаться на файл, а не каталог. Возможно, вы пытаетесь сделать cd тому, что является файлом, или это должен быть файл.

Во-вторых, SFTP использует unix-подобную модель для путей. Пути, начинающиеся с «/», являются абсолютными путями и разрешаются из корневого каталога сервера. Пути, которые не начинаются с «/», являются относительными путями и разрешены из каталога, в котором запускался ваш сеанс SFTP (обычно это домашний каталог для учетной записи, на которую вы вошли на сервер).

Ваше значение SFTPWORKINGDIR - это путь в формате Windows, а не путь в формате unix. Очень вероятно, что сервер SFTP не интерпретирует его так, как вы планируете, даже если этот SFTP-сервер работает в системе Windows. Вы должны проконсультироваться с документацией для вашего SFTP-сервера и преобразовать путь в соответствующую форму для доступа к нужной директории. Если SFTP-сервер является сервером Cygwin openssh, я считаю, что правильная форма будет выглядеть как «/ cygdrive/c/Users/sam/Desktop».

0

Вот полный «код загрузки» с аутентификацией с Windows-машины на Linux-машину. этот код загружает файл из определенного места с вашего компьютера (выигрывает) и загружает его на FTP-сервер. Это мое решение, которое я применил для своей проблемы. если кто-то видит проблему, прокомментируйте.

try { 
     JSch jsch = new JSch(); 
     Session session = jsch.getSession("<userName>", "<ip_block>", 22); 
     session.setConfig("PreferredAuthentications", "password"); 
     session.setPassword("<pasword>"); 
     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no");//do not prefer this. demo only 
     session.setConfig(config); 
     session.connect(1200); 
     Channel channel = session.openChannel("sftp"); 
     ChannelSftp sftp = (ChannelSftp) channel; 
     sftp.connect(600); 
     channel = session.openChannel("sftp"); 
     channel.connect(); 
     try { 
      File f = new File("E:/apache-tomcat-7.0.65/bin/" + this.fileName); 
      sftp.put(new FileInputStream(f), f.getName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     channel.disconnect(); 
     sftp.disconnect(); 
    } catch (JSchException e) { 
     e.printStackTrace(); 
    } 
Смежные вопросы