2010-02-27 88 views
11

我正在尋找用於SFTP文件傳輸的死亡簡單Java庫。除此之外,我不需要任何其他功能。Java SFTP傳輸庫

我已經嘗試了Zehon的,但它是令人難以置信的嘮叨,我認爲8個jar文件是有點瘋狂的功能,因爲我需要。

和圖書館必須是免費的(如免費啤酒),更好的開源(不是要求)。

謝謝。

+0

通過SSH隧道的FTP? – 2010-02-27 09:06:57

+2

http://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol – 2010-02-27 09:16:02

+1

如果這就是你的意思,請使用術語「SFTP」。在FTP,SFTP/SSH,FTPS和通過SSH隧道傳輸常規FTP之間,首字母縮略詞變得模糊不清。 – prestomation 2010-02-27 16:44:25

回答

27

編輯:我要保持我以前的答案,如JSch在許多地方仍在使用,但如果你需要一個更好的詳細記錄庫,你可以使用sshj。在如何使用它做SFTP的一個例子是:

SSHClient ssh = new SSHClient(); 
ssh.loadKnownHosts(); 
ssh.connect("host"); 
try { 
    ssh.authPassword("username", "password"); 
    SFTPClient sftp = ssh.newSFTPClient(); 
    try { 
     sftp.put(new FileSystemFile("/path/of/local/file"), "/path/of/ftp/file"); 
    } finally { 
     sftp.close(); 
    } 
} finally { 
    ssh.disconnect(); 
} 

使用JSch(一個Java SSH lib下,通過螞蟻例如使用),你可以做這樣的事情:

Session session = null; 
Channel channel = null; 
try { 
    JSch ssh = new JSch(); 
    ssh.setKnownHosts("/path/of/known_hosts/file"); 
    session = ssh.getSession("username", "host", 22); 
    session.setPassword("password"); 
    session.connect(); 
    channel = session.openChannel("sftp"); 
    channel.connect(); 
    ChannelSftp sftp = (ChannelSftp) channel; 
    sftp.put("/path/of/local/file", "/path/of/ftp/file"); 
} catch (JSchException e) { 
    e.printStackTrace(); 
} catch (SftpException e) { 
    e.printStackTrace(); 
} finally { 
    if (channel != null) { 
     channel.disconnect(); 
    } 
    if (session != null) { 
     session.disconnect(); 
    } 
} 

這裏是another link使用JSch做SFTP。

你可以直接使用JSch或者通過Commons VFS,但是你必須同時擁有commons vfs jar和jsch jar。

+0

我發現了一個更簡單的方法來做到這一點,我會編輯我的答案。 – 2010-02-27 16:20:41

+1

JSch是一個偉大的圖書館,但嚴重缺乏文檔。我發現http://timarcher.com/node/57是一個非常有用的例子。 – UmYeah 2010-02-27 16:55:33

+0

感謝您的鏈接,我會將其添加到答案。事實上,JSch確實缺乏文檔(和源代碼可讀性,就像他們在野外公佈的那樣),但它完美地完成了這項工作。 – 2010-02-27 16:58:40

-2

來自Apache Commons的FTPSClient怎麼樣?

+13

你的建議是FTPS,而不是SFTP。 – 2010-02-27 09:42:38

6

以下是使用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(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (SftpException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

此答案不擔心關於安全性,而不是關鍵的檢查。通過使用'StrictHostKeyChecking = no',你會失去任何安全性。不建議任何人使用它,而不解釋後果。 – 2016-02-16 13:28:20

3

exit()和disconnect()必須放在finally塊中。在這個例子中,我們得到了一個永無止境的程序,因爲第二個線程不會終止。

+0

這不是一個真正的答案,而是@Iraklis上面的答案。 – hotshot309 2013-11-18 17:46:06