2010-02-27 52 views
11

Tôi đang tìm Thư viện Java đơn giản đã chết để sử dụng để chuyển tệp SFTP. Tôi không cần bất kỳ tính năng nào khác ngoài đó.Thư viện chuyển thư viện SFTP của Java

Tôi đã thử Zehon, nhưng nó khó tin đáng kinh ngạc, và tôi nghĩ rằng 8 tệp jar là một chút điên rồ cho rất ít chức năng như tôi yêu cầu.

Và thư viện phải miễn phí (như trong bia miễn phí) và Nguồn mở thích hợp hơn (không phải yêu cầu).

Cảm ơn.

+0

ftp trên đường hầm ssh? –

+2

http://en.wikipedia.org/wiki/SSH_File_Transfer_Protocol –

+1

Vui lòng sử dụng cụm từ "SFTP" nếu đó là ý của bạn. Giữa FTP, SFTP/SSH, FTPS và đường hầm thường xuyên FTP qua SSH, từ viết tắt trở nên mơ hồ. – prestomation

Trả lời

27

Chỉnh sửa: Tôi sẽ giữ câu trả lời trước, vì JSch vẫn được sử dụng ở nhiều nơi, nhưng nếu cần thư viện tài liệu tốt hơn, bạn có thể sử dụng sshj. Một ví dụ về cách sử dụng nó để làm sftp là:

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(); 
} 

Sử dụng JSch (một lib java ssh, được sử dụng bởi Ant chẳng hạn), bạn có thể làm một cái gì đó như thế:

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(); 
    } 
} 

Đây là another link sử dụng JSch để thực hiện SFTP.

Bạn có thể sử dụng JSch trực tiếp theo cách này hoặc thông qua Commons VFS, nhưng sau đó bạn sẽ phải có cả hai vons jar và jsch jar chung.

+0

Tôi tìm thấy một cách đơn giản hơn để làm điều đó, tôi sẽ chỉnh sửa câu trả lời của mình. –

+1

JSch là một thư viện tuyệt vời nhưng thiếu tài liệu. Tôi tìm thấy http://timarcher.com/node/57 là một ví dụ thực sự hữu ích. – UmYeah

+0

Cảm ơn bạn đã liên kết, tôi sẽ thêm nó vào câu trả lời. Thật vậy, JSch thực sự thiếu tài liệu (và khả năng đọc mã nguồn, nó giống như họ phát hành nó trong tự nhiên), nhưng nó thực hiện công việc một cách hoàn hảo. –

-2

Làm thế nào về FTPSClient từ Apache Commons?

+13

Điều bạn đang đề xuất là FTPS chứ không phải SFTP. –

6

Đây là mã nguồn hoàn chỉnh của một ví dụ sử dụng JSch mà không phải lo lắng về việc kiểm tra khóa 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

Câu trả lời này không lo lắng về an ninh, không phải về kiểm tra chính. Bằng cách sử dụng 'StrictHostKeyChecking = no' bạn mất bất kỳ bảo mật nào. Không khuyên bất cứ ai sử dụng nó, mà không giải thích hậu quả. –

3

Thoát() và ngắt kết nối() phải được đặt trong khối cuối cùng. Trong ví dụ này, chúng tôi đã có một chương trình không bao giờ kết thúc trong trường hợp ngoại lệ vì một chuỗi thứ hai sẽ không chấm dứt.

+0

Đây không thực sự là câu trả lời, nhưng là một nhận xét hữu ích về câu trả lời của @Iraklis 'ở trên. – hotshot309