2011-06-09 111 views
1

我需要幫助連接到SFTP服務器?有人有工作代碼嗎?使用java連接到SFTP

,我發現這樣的事情

package test.JSch; 

import com.jcraft.jsch.*; 

public class TestJSch { 
public static void main(String args[]) { 
    JSch jsch = new JSch(); 
    Session session = null; 
    try { 
     session = jsch.getSession("USSERNAME", "HOST", 22); 
     //session.setConfig("StrictHostKeyChecking", "no"); 
     session.setPassword("PASSWORD"); 
     System.out.println("1"); 
     session.connect(); 
     System.out.println("2"); 

     Channel channel = session.openChannel("sftp"); 
     System.out.println("3"); 
     channel.connect(); 
     System.out.println("4"); 
     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(); 
    } 
    } 
} 

但這是輸出

com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect 
    at com.jcraft.jsch.Util.createSocket(Util.java:258) 
    at com.jcraft.jsch.Session.connect(Session.java:186) 
    at com.jcraft.jsch.Session.connect(Session.java:145) 
    at test.JSch.TestJSch.main(TestJSch.java:17) 
Caused by: java.net.ConnectException: Connection timed out: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at java.net.Socket.<init>(Unknown Source) 
    at com.jcraft.jsch.Util.createSocket(Util.java:252) 
    ... 3 more 

什麼是錯的代碼?

+1

當你說它不起作用時,你可以更具體嗎?你有什麼異常?它是否編譯?你在用什麼庫? – 2011-06-09 09:22:09

回答

1

這是Stackoverflow的一個早期問題,接受的答案建議使用JSch library

How to retrieve a file from a server via SFTP?

我看到你試圖通過JSch連接並得到了一個錯誤。

我建議首先要檢查您是否可以從客戶端(您正在測試您的程序的同一臺計算機)連接到sftp計算機,使用標準的sftp客戶端(如Windows上的Filezilla)或者僅僅是sftp命令在* nix系統中的終端上。

0

我已經成功使用JSch library。臭名昭着的文檔很糟糕,但傳聞要非常嚴格和高效地實施其SSH功能。

0

您可以使用Apache commons VFS

FileSystemManager fsManager = VFS.getManager(); 
FileObject remoteFile = fsManager.resolveFile("sftp://myusername:[email protected]/pub/downloads/somefile.tgz"); 
InputStream in = remoteFile.getContent().getInputStream(); 
+0

VFS不是一大堆不同類型的文件管理工具,它們都依賴於其他幾個jar文件?如果OP只需要SFTP部分,那麼VFS會有點過分。 – deltaforce2 2011-06-09 12:37:28

+0

它看起來已經過時 – Njax3SmmM2x2a0Zf7Hpd 2013-12-16 17:17:33

+0

http://code.google.com/p/otrosvfsbrowser/正在使用Apache Commons VFS ver.2瀏覽包括SFTP在內的遠程文件系統。它工作得很好。 – KrzyH 2013-12-18 11:40:21

2

您可以嘗試增加對Jsch框架超時。

session.connect(int Timeout) 

session.connect(30000); 

更多關於Jcsh javadoc

+0

超時以毫秒或秒爲單位? – Maverick 2016-01-25 13:27:01

0

JSch API:session.connect(); 再次詢問用戶名和密碼連接到服務器,即使這些作爲參數傳遞。

如何使代碼避免再次詢問用戶名和密碼。