2008-08-18 4 views

ответ

176

Другой вариант рассмотреть глядя на JSch library. Кажется, что JSch является предпочтительной библиотекой для нескольких крупных проектов с открытым исходным кодом, включая Eclipse, Ant и Apache Commons HttpClient, среди прочих.

Он поддерживает как логин пользователя, так и пароль и сертификаты, а также весь набор других yummy функций SSH2.

Вот простой удаленный файл для SFTP. Обработка ошибок остаются в качестве упражнения для читателя :-)

JSch jsch = new JSch(); 

String knownHostsFilename = "/home/username/.ssh/known_hosts"; 
jsch.setKnownHosts(knownHostsFilename); 

Session session = jsch.getSession("remote-username", "remote-host");  
{ 
    // "interactive" version 
    // can selectively update specified known_hosts file 
    // need to implement UserInfo interface 
    // MyUserInfo is a swing implementation provided in 
    // examples/Sftp.java in the JSch dist 
    UserInfo ui = new MyUserInfo(); 
    session.setUserInfo(ui); 

    // OR non-interactive version. Relies in host key being in known-hosts file 
    session.setPassword("remote-password"); 
} 

session.connect(); 

Channel channel = session.openChannel("sftp"); 
channel.connect(); 

ChannelSftp sftpChannel = (ChannelSftp) channel; 

sftpChannel.get("remote-file", "local-file"); 
// OR 
InputStream in = sftpChannel.get("remote-file"); 
    // process inputstream as needed 

sftpChannel.exit(); 
session.disconnect(); 
+1

Cheekysoft, Я заметил - при использовании Jsch - удаление файлов на sftp-сервере не работает. Также переименование файлов также не работает. Любые идеи, пожалуйста ??? Andy – 2011-01-31 01:24:33

+1

Извините, в данный момент я не работаю. (Пожалуйста, попробуйте оставить эти ответы в виде комментариев - как это сообщение - а не как новый ответ на исходный вопрос) – Cheekysoft 2011-01-31 01:24:33

+1

Что такое этот блок кода после назначения сеанса? Это какой-то причудливый синтаксис Java, который я никогда не видел? Если да - то, что это делает, чтобы быть написанным таким образом? – 2014-10-17 14:19:30

23

Это было решение, которое я придумал с http://sourceforge.net/projects/sshtools/ (большая часть обработки ошибок опущена для ясности). Это отрывок из my blog

SshClient ssh = new SshClient(); 
ssh.connect(host, port); 
//Authenticate 
PasswordAuthenticationClient passwordAuthenticationClient = new PasswordAuthenticationClient(); 
passwordAuthenticationClient.setUsername(userName); 
passwordAuthenticationClient.setPassword(password); 
int result = ssh.authenticate(passwordAuthenticationClient); 
if(result != AuthenticationProtocolState.COMPLETE){ 
    throw new SFTPException("Login to " + host + ":" + port + " " + userName + "/" + password + " failed"); 
} 
//Open the SFTP channel 
SftpClient client = ssh.openSftpClient(); 
//Send the file 
client.put(filePath); 
//disconnect 
client.quit(); 
ssh.disconnect(); 
+0

j2ssh довольно багги – 2010-02-13 05:13:19

+5

Я согласен (с опозданием), он отлично работал для оригинального сайта/загрузки, который мне нужен, но он отказался работать для нового. Я в процессе перехода на JSch – 2011-01-27 14:09:09

22

Хорошей абстракции на вершине JSch является Apache commons-vfs, который предлагает виртуальную файловую систему API, что делает доступ и запись SFTP файлы практически прозрачными. Хорошо работает для нас.

+1

Можно ли использовать предварительно разделяемые ключи в сочетании с commons-vfs? – 2009-05-15 13:46:16

+2

Да, это так. Если вам нужны нестандартные идентификаторы, вы можете вызвать SftpFileSystemConfigBuilder.getInstance(). SetIdentities (...). – 2011-01-27 11:05:54

+0

Вы можете использовать предварительно разделяемые ключи. Но эти ключи должны быть без пароля. OtrosLogViewer использует авторизацию ключа SSH с VFS, но для удаления кодовой фразы из ключа (http://code.google.com/p/otroslogviewer/wiki/SftpAuthPubKey) – KrzyH 2012-12-18 13:05:07

0

Лучшее решение, которое я нашел, это Paramiko. Есть версия Java.

+0

http://www.lag.net/jaramiko/ последнее обновление 12 -Nov-2007; ( – 2013-02-19 12:09:21

+0

https://github.com/terencehonles/jaramiko заброшен в пользу JSch (см. Уведомление о github). – 2015-10-06 15:04:20

2

Try edtFTPj/PRO, зрелая, надежный клиентом библиотеки SFTP, которая поддерживает пулы соединений и асинхронные операции. Также поддерживает FTP и FTPS, поэтому все базы для безопасной передачи файлов покрываются.

1

Я использую этот SFTP-API под названием Zehon, это замечательно, так просто использовать с большим количеством примеров кода. Вот сайт http://www.zehon.com

6

hierynomus/sshj имеет полное осуществление SFTP версии 3 (то, что реализует OpenSSH)

Пример кода из SFTPUpload.java

package net.schmizz.sshj.examples; 

import net.schmizz.sshj.SSHClient; 
import net.schmizz.sshj.sftp.SFTPClient; 
import net.schmizz.sshj.xfer.FileSystemFile; 

import java.io.File; 
import java.io.IOException; 

/** This example demonstrates uploading of a file over SFTP to the SSH server. */ 
public class SFTPUpload { 

    public static void main(String[] args) 
      throws IOException { 
     final SSHClient ssh = new SSHClient(); 
     ssh.loadKnownHosts(); 
     ssh.connect("localhost"); 
     try { 
      ssh.authPublickey(System.getProperty("user.name")); 
      final String src = System.getProperty("user.home") + File.separator + "test_file"; 
      final SFTPClient sftp = ssh.newSFTPClient(); 
      try { 
       sftp.put(new FileSystemFile(src), "/tmp"); 
      } finally { 
       sftp.close(); 
      } 
     } finally { 
      ssh.disconnect(); 
     } 
    } 

} 
36

Ниже приведен пример использования Apache Common VFS:

FileSystemOptions fsOptions = new FileSystemOptions(); 
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no"); 
FileSystemManager fsManager = VFS.getManager(); 
String uri = "sftp://user:[email protected]:port/absolute-path"; 
FileObject fo = fsManager.resolveFile(uri, fsOptions); 
91

Вот полный исходный код примера с использованием JSch без беспокоиться о проверке ключа ssh.

import com.jcraft.jsch.*; 

public class TestJSch { 
    public static void main(String args[]) { 
     JSch jsch = new JSch(); 
     Session session = null; 
     try { 
      session = jsch.getSession("username", "127.0.0.1", 22); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setPassword("password"); 
      session.connect(); 

      Channel channel = session.openChannel("sftp"); 
      channel.connect(); 
      ChannelSftp sftpChannel = (ChannelSftp) channel; 
      sftpChannel.get("remotefile.txt", "localfile.txt"); 
      sftpChannel.exit(); 
      session.disconnect(); 
     } catch (JSchException e) { 
      e.printStackTrace(); 
     } catch (SftpException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
3

Энди, удалить файл на удаленной системе, необходимо использовать (channelExec) из JSch и передать UNIX/Linux команды, чтобы удалить его.

2

Хотя ответы выше были очень полезными, я провел день, чтобы заставить их работать, сталкиваясь с различными исключениями, такими как «сломанный канал», «rsa key unknown» и «packet corrupt».

Ниже приведен рабочий класс повторного использования для SFTP-файлов ЗАГРУЗИТЬ/ЗАГРУЗИТЬ с использованием библиотеки JSch.

Использование загрузки:

SFTPFileCopy upload = new SFTPFileCopy(true, /path/to/sourcefile.png", /path/to/destinationfile.png"); 

Скачать использование:

SFTPFileCopy download = new SFTPFileCopy(false, "/path/to/sourcefile.png", "/path/to/destinationfile.png"); 

Класс Код:

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelSftp; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import com.jcraft.jsch.UIKeyboardInteractive; 
import com.jcraft.jsch.UserInfo; 
import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import javax.swing.JOptionPane; 
import menue.Menue; 

public class SFTPFileCopy1 { 

    public SFTPFileCopy1(boolean upload, String sourcePath, String destPath) throws FileNotFoundException, IOException { 
     Session session = null; 
     Channel channel = null; 
     ChannelSftp sftpChannel = null; 
     try { 
      JSch jsch = new JSch(); 
      //jsch.setKnownHosts("/home/user/.putty/sshhostkeys"); 
      session = jsch.getSession("login", "mysite.com", 22); 
      session.setPassword("password"); 

      UserInfo ui = new MyUserInfo() { 
       public void showMessage(String message) { 

        JOptionPane.showMessageDialog(null, message); 

       } 

       public boolean promptYesNo(String message) { 

        Object[] options = {"yes", "no"}; 

        int foo = JOptionPane.showOptionDialog(null, 
          message, 
          "Warning", 
          JOptionPane.DEFAULT_OPTION, 
          JOptionPane.WARNING_MESSAGE, 
          null, options, options[0]); 

        return foo == 0; 

       } 
      }; 
      session.setUserInfo(ui); 

      session.setConfig("StrictHostKeyChecking", "no"); 
      session.connect(); 
      channel = session.openChannel("sftp"); 
      channel.setInputStream(System.in); 
      channel.setOutputStream(System.out); 
      channel.connect(); 
      sftpChannel = (ChannelSftp) channel; 

      if (upload) { // File upload. 
       byte[] bufr = new byte[(int) new File(sourcePath).length()]; 
       FileInputStream fis = new FileInputStream(new File(sourcePath)); 
       fis.read(bufr); 
       ByteArrayInputStream fileStream = new ByteArrayInputStream(bufr); 
       sftpChannel.put(fileStream, destPath); 
       fileStream.close(); 
      } else { // File download. 
       byte[] buffer = new byte[1024]; 
       BufferedInputStream bis = new BufferedInputStream(sftpChannel.get(sourcePath)); 
       OutputStream os = new FileOutputStream(new File(destPath)); 
       BufferedOutputStream bos = new BufferedOutputStream(os); 
       int readCount; 
       while ((readCount = bis.read(buffer)) > 0) { 
        bos.write(buffer, 0, readCount); 
       } 
       bis.close(); 
       bos.close(); 
      } 
     } catch (Exception e) { 
      System.out.println(e); 
     } finally { 
      if (sftpChannel != null) { 
       sftpChannel.exit(); 
      } 
      if (channel != null) { 
       channel.disconnect(); 
      } 
      if (session != null) { 
       session.disconnect(); 
      } 
     } 
    } 

    public static abstract class MyUserInfo 
      implements UserInfo, UIKeyboardInteractive { 

     public String getPassword() { 
      return null; 
     } 

     public boolean promptYesNo(String str) { 
      return false; 
     } 

     public String getPassphrase() { 
      return null; 
     } 

     public boolean promptPassphrase(String message) { 
      return false; 
     } 

     public boolean promptPassword(String message) { 
      return false; 
     } 

     public void showMessage(String message) { 
     } 

     public String[] promptKeyboardInteractive(String destination, 
       String name, 
       String instruction, 
       String[] prompt, 
       boolean[] echo) { 

      return null; 
     } 
    } 
} 
10

Apache Commons SFTP библиотека

Общей ява файл свойств для всех примеров

АдресСервер = 111.222.333.444

= идентификатор пользователя myUserId

пароль = MyPassword

remoteDirectory = продукты/

localDirectory = импорт/

Загрузить файл на удаленный сервер с помощью SFTP

import java.io.File; 
import java.io.FileInputStream; 
import java.util.Properties; 

import org.apache.commons.vfs2.FileObject; 
import org.apache.commons.vfs2.FileSystemOptions; 
import org.apache.commons.vfs2.Selectors; 
import org.apache.commons.vfs2.impl.StandardFileSystemManager; 
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; 

public class SendMyFiles { 

static Properties props; 

public static void main(String[] args) { 

    SendMyFiles sendMyFiles = new SendMyFiles(); 
    if (args.length < 1) 
    { 
    System.err.println("Usage: java " + sendMyFiles.getClass().getName()+ 
    " Properties_file File_To_FTP "); 
    System.exit(1); 
    } 

    String propertiesFile = args[0].trim(); 
    String fileToFTP = args[1].trim(); 
    sendMyFiles.startFTP(propertiesFile, fileToFTP); 

} 

public boolean startFTP(String propertiesFilename, String fileToFTP){ 

    props = new Properties(); 
    StandardFileSystemManager manager = new StandardFileSystemManager(); 

    try { 

    props.load(new FileInputStream("properties/" + propertiesFilename)); 
    String serverAddress = props.getProperty("serverAddress").trim(); 
    String userId = props.getProperty("userId").trim(); 
    String password = props.getProperty("password").trim(); 
    String remoteDirectory = props.getProperty("remoteDirectory").trim(); 
    String localDirectory = props.getProperty("localDirectory").trim(); 

    //check if the file exists 
    String filepath = localDirectory + fileToFTP; 
    File file = new File(filepath); 
    if (!file.exists()) 
    throw new RuntimeException("Error. Local file not found"); 

    //Initializes the file manager 
    manager.init(); 

    //Setup our SFTP configuration 
    FileSystemOptions opts = new FileSystemOptions(); 
    SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
    opts, "no"); 
    SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true); 
    SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000); 

    //Create the SFTP URI using the host name, userid, password, remote path and file name 
    String sftpUri = "sftp://" + userId + ":" + password + "@" + serverAddress + "/" + 
    remoteDirectory + fileToFTP; 

    // Create local file object 
    FileObject localFile = manager.resolveFile(file.getAbsolutePath()); 

    // Create remote file object 
    FileObject remoteFile = manager.resolveFile(sftpUri, opts); 

    // Copy local file to sftp server 
    remoteFile.copyFrom(localFile, Selectors.SELECT_SELF); 
    System.out.println("File upload successful"); 

    } 
    catch (Exception ex) { 
    ex.printStackTrace(); 
    return false; 
    } 
    finally { 
    manager.close(); 
    } 

    return true; 
} 


} 

Скачать файл с удаленного сервера с помощью SFTP

import java.io.File; 
import java.io.FileInputStream; 
import java.util.Properties; 

import org.apache.commons.vfs2.FileObject; 
import org.apache.commons.vfs2.FileSystemOptions; 
import org.apache.commons.vfs2.Selectors; 
import org.apache.commons.vfs2.impl.StandardFileSystemManager; 
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; 

public class GetMyFiles { 

static Properties props; 

public static void main(String[] args) { 

    GetMyFiles getMyFiles = new GetMyFiles(); 
    if (args.length < 1) 
    { 
    System.err.println("Usage: java " + getMyFiles.getClass().getName()+ 
    " Properties_filename File_To_Download "); 
    System.exit(1); 
    } 

    String propertiesFilename = args[0].trim(); 
    String fileToDownload = args[1].trim(); 
    getMyFiles.startFTP(propertiesFilename, fileToDownload); 

} 

public boolean startFTP(String propertiesFilename, String fileToDownload){ 

    props = new Properties(); 
    StandardFileSystemManager manager = new StandardFileSystemManager(); 

    try { 

    props.load(new FileInputStream("properties/" + propertiesFilename)); 
    String serverAddress = props.getProperty("serverAddress").trim(); 
    String userId = props.getProperty("userId").trim(); 
    String password = props.getProperty("password").trim(); 
    String remoteDirectory = props.getProperty("remoteDirectory").trim(); 
    String localDirectory = props.getProperty("localDirectory").trim(); 


    //Initializes the file manager 
    manager.init(); 

    //Setup our SFTP configuration 
    FileSystemOptions opts = new FileSystemOptions(); 
    SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
    opts, "no"); 
    SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true); 
    SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000); 

    //Create the SFTP URI using the host name, userid, password, remote path and file name 
    String sftpUri = "sftp://" + userId + ":" + password + "@" + serverAddress + "/" + 
    remoteDirectory + fileToDownload; 

    // Create local file object 
    String filepath = localDirectory + fileToDownload; 
    File file = new File(filepath); 
    FileObject localFile = manager.resolveFile(file.getAbsolutePath()); 

    // Create remote file object 
    FileObject remoteFile = manager.resolveFile(sftpUri, opts); 

    // Copy local file to sftp server 
    localFile.copyFrom(remoteFile, Selectors.SELECT_SELF); 
    System.out.println("File download successful"); 

    } 
    catch (Exception ex) { 
    ex.printStackTrace(); 
    return false; 
    } 
    finally { 
    manager.close(); 
    } 

    return true; 
} 

} 

Удалить файл на удаленном сервере с помощью SFTP

import java.io.FileInputStream; 
import java.util.Properties; 

import org.apache.commons.vfs2.FileObject; 
import org.apache.commons.vfs2.FileSystemOptions; 
import org.apache.commons.vfs2.impl.StandardFileSystemManager; 
import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; 

public class DeleteRemoteFile { 

static Properties props; 

public static void main(String[] args) { 

    DeleteRemoteFile getMyFiles = new DeleteRemoteFile(); 
    if (args.length < 1) 
    { 
    System.err.println("Usage: java " + getMyFiles.getClass().getName()+ 
    " Properties_filename File_To_Delete "); 
    System.exit(1); 
    } 

    String propertiesFilename = args[0].trim(); 
    String fileToDownload = args[1].trim(); 
    getMyFiles.startFTP(propertiesFilename, fileToDownload); 

} 

public boolean startFTP(String propertiesFilename, String fileToDownload){ 

    props = new Properties(); 
    StandardFileSystemManager manager = new StandardFileSystemManager(); 

    try { 

    props.load(new FileInputStream("properties/" + propertiesFilename)); 
    String serverAddress = props.getProperty("serverAddress").trim(); 
    String userId = props.getProperty("userId").trim(); 
    String password = props.getProperty("password").trim(); 
    String remoteDirectory = props.getProperty("remoteDirectory").trim(); 


    //Initializes the file manager 
    manager.init(); 

    //Setup our SFTP configuration 
    FileSystemOptions opts = new FileSystemOptions(); 
    SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(
    opts, "no"); 
    SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, true); 
    SftpFileSystemConfigBuilder.getInstance().setTimeout(opts, 10000); 

    //Create the SFTP URI using the host name, userid, password, remote path and file name 
    String sftpUri = "sftp://" + userId + ":" + password + "@" + serverAddress + "/" + 
    remoteDirectory + fileToDownload; 

    //Create remote file object 
    FileObject remoteFile = manager.resolveFile(sftpUri, opts); 

    //Check if the file exists 
    if(remoteFile.exists()){ 
    remoteFile.delete(); 
    System.out.println("File delete successful"); 
    } 

    } 
    catch (Exception ex) { 
    ex.printStackTrace(); 
    return false; 
    } 
    finally { 
    manager.close(); 
    } 

    return true; 
} 

} 
13

Существует хорошее сравнение 3 зрелыми Java библиотеки для SFTP: Commons VFS, SSHJ and JSch

Резюмируя SSHJ имеет ясный API и это самый лучший из них, если вам не нужны другие хранилища поддержки, предоставляемой от Commons VFS.

Здесь редактируется примером SSHJ из github:

final SSHClient ssh = new SSHClient(); 
ssh.loadKnownHosts(); // or, to skip host verification: ssh.addHostKeyVerifier(new PromiscuousVerifier()) 
ssh.connect("localhost"); 
try { 
    ssh.authPassword("user", "password"); // or ssh.authPublickey(System.getProperty("user.name")) 
    final SFTPClient sftp = ssh.newSFTPClient(); 
    try { 
     sftp.get("test_file", "/tmp/test.tmp"); 
    } finally { 
     sftp.close(); 
    } 
} finally { 
    ssh.disconnect(); 
} 
2

JSch библиотека является мощной библиотекой, которая может быть использована для чтения файла с сервера SFTP. Ниже тестируемый код для чтения файла из SFTP расположения построчно

JSch jsch = new JSch(); 
     Session session = null; 
     try { 
      session = jsch.getSession("user", "127.0.0.1", 22); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setPassword("password"); 
      session.connect(); 

      Channel channel = session.openChannel("sftp"); 
      channel.connect(); 
      ChannelSftp sftpChannel = (ChannelSftp) channel; 

      InputStream stream = sftpChannel.get("/usr/home/testfile.txt"); 
      try { 
       BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
       String line; 
       while ((line = br.readLine()) != null) { 
        System.out.println(line); 
       } 

      } catch (IOException io) { 
       System.out.println("Exception occurred during reading file from SFTP server due to " + io.getMessage()); 
       io.getMessage(); 

      } catch (Exception e) { 
       System.out.println("Exception occurred during reading file from SFTP server due to " + e.getMessage()); 
       e.getMessage(); 

      } 

      sftpChannel.exit(); 
      session.disconnect(); 
     } catch (JSchException e) { 
      e.printStackTrace(); 
     } catch (SftpException e) { 
      e.printStackTrace(); 
     } 

Пожалуйста, обратитесь blog для всей программы.

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