2013-12-13 146 views
5

我通過sftp(JSCH)連接到FTP服務器。JSCH:SFTP。掛在session.connect()使用端口21

Evertime我使用端口21連接到FTP服務器,它總是在session.connect()掛起。

它不會拋出任何異常。但是當我使用其他端口。它工作,它會拋出異常。

有什麼辦法可以捕獲錯誤?

這是我的代碼示例。

public static void main(String[] args) throws SftpException { 

    JSch jsch = new JSch(); 

    try { 

     Session session = jsch.getSession("username", "host", 21); 
     session.setConfig("StrictHostKeyChecking", "no"); 
     session.setPassword("password"); 
     session.connect(); 

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

    } catch (JSchException e) { 
     log("Cannot make connection to FTP server "); 
     e.printStackTrace(); 

    } 

} 
+0

沒有'其他港口'。端口22是SSH端口。港口21當然不是。 – EJP

+0

我知道沒有其他港口。我的問題是,我期待它拋出一個異常。但它只是掛在session.connect() – aeycee

回答

6

難道是端口22是SFTP的默認端口嗎?而運行在端口21上的FTP服務器將不知道如何協商安全FTP的對話。基本上,SFTP是通過SSH的FTP。

編輯: 問題是,它正在無限期地等待協商完成。這是墨西哥的一次派對,沒有放棄任何一方。在session.connect()之前撥打session.setTimeout(),或撥打電話session.connect(timeout),以一些合適的值(3-5秒)。我相信超時是毫秒。

+0

它只是我的問題是當用戶輸入22以外的端口。我希望JSCH會拋出一個異常。我的問題是它不會拋出任何錯誤。我只是掛在session.connect()。當我使用端口22時,我可以成功連接到FTP服務器。 – aeycee

+1

請參閱上面的回答編輯。 – brettw

+1

非常感謝。它的工作現在。 – aeycee

6

我有一個類似的問題,但與正確的端口。 session.connect()只是掛起並不返回任何東西。而其他程序可以成功連接。

原因是主機提供了更多的認證方法,我們必須指出Jsch只使用密碼。

 java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     config.put("PreferredAuthentications", "password"); 
     session.setConfig(config); 
+0

我的問題是每次連接到SFTP時,session.connection()會在1-2秒內設置它們連接的屬性後最多需要40秒。 –

1

我們從webMethods服務器上運行JSch。 當我們嘗試連接到我們的某個合作伙伴時,升級到新版本後,它會掛起連接步驟。

此處提出的解決方案尚未運行。我已經收到此錯誤:

com.jcraft.jsch.JSchException:驗證失敗

我注意到我們正在試圖連接到被詢問用戶名和密碼前,連接服務器完成:

[[email protected] sftpTest]$ /opt/sag/95/sitcore/jvm/jvm/bin/java -jar  
SftpConnect.jar 
Password has been set 
Timeout has been set 
Kerberos username [sagtest]: 
Kerberos password for sagtest: 
Connected 
Channel opened 
Connected 
Session: iui-bpjobs01.itservices.lan:22:bp-xfer-int:1738666864 

Kerberos用戶和密碼不應該在那裏。

後小調查,我發現這個網頁: Skipping Kerberos authentication prompts with JSch

設置PreferredAuthentications到其他值之後 - 都一直工作正常。我已經添加的代碼:

session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); 

下面是完整的例子,我已經得到了 - 也許這將幫助別人來調試您的問題:

public static void main (String[] args){ 
    String serverport = "22"; 
    String serverhost = "XXXX"; 
    String username = "YYYY"; 
    String password = "ZZZZZ"; 
    int timeout = 5000; 
    try{ 
     int port = 22; 
     String sessionkey = null; 
     if(serverport != null && !serverport.trim().equals("")) 
      port = Integer.parseInt(serverport); 
     JSch jsch=new JSch(); 

     Session session=jsch.getSession(username, serverhost, port); 
     jsch.setKnownHosts(System.getProperty("user.home")+"/.ssh/known_hosts"); 

     session.setPassword(password); 
     System.out.println("Password has been set"); 
     if(timeout > 0){ 
      session.setTimeout(timeout); 
      System.out.println("Timeout has been set"); 
     } 
     session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); 
     System.out.println("Added PreferredAuthentications"); 
     session.connect(); 
     System.out.println("Connected"); 

     Channel channel = session.openChannel("sftp"); 
     System.out.println("Channel opened"); 
     channel.connect(); 
     System.out.println("Connected"); 
     if (channel.isConnected()){ 
      sessionkey = serverhost + ":" + serverport + ":" + username + ":" + Thread.currentThread().hashCode(); 
     } 
     System.out.println("Session: "+sessionkey); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
0

在我的情況下,只有更新JSch到最新的版本(目前是1.50)已經解決了這個問題,似乎在老版本的JSch和最新的OpenSSH 7.1版本的key/auth握手中存在不兼容問題。x