2012-05-17 684 views
3

我是Jsch的新手,我嘗試通過sftp連接到第三方。我可以通過SSH連接,所以我知道我有正確的用戶,主機,端口和私鑰文件,但是當我嘗試通過Jsch進行連接時,我收到了「Auth failed」異常消息,這幾乎但不完全有用。這裏是我的代碼,我從例子拼湊在線:jsch session.connect()問題

String pvtkey = "{unixpath}/id_dsa"; 
ChannelSftp sftp = null; 
JSch jsch = new JSch(); 
Session session = null; 



    try{ 
     jsch.setKnownHosts("{unixpath}/known_hosts"); 
     jsch.addIdentity(pvtkey); 
     session = jsch.getSession(user, connectionURL, 22); 
     Properties config = new Properties(); 
     config.put("StrictHostKeyChecking", "no"); 
     session.setConfig(config); 
     session.connect(); 
        ...some other code that never gets called 
      }catch(JSchException e){ 
       log.info(e.getMessage()); 
       log.error(e.getCause()); 
      } 

我加了一些日誌,所以我知道故障發生的事情爲session.connect()。我抓住了用戶和connectionURL並確認他們正在被正確傳入。 pvtkey和known_hosts的路徑是完整的unix路徑,我保存密鑰和主機文件,我已將其移至保存腳本的目錄,以啓動此過程。我對sftp還是有點新意,即使我沒有將它添加到Jsch連接中,我的公鑰是否也必須位於同一個目錄中?有什麼方法可以獲得有關我失敗的更多信息嗎?

感謝

回答

0

是的,如果你使用公鑰認證,JSch期待在同一個目錄中的公鑰文件(及同名的增加.pub)爲你作爲一個傳遞的私鑰文件參數爲addIdentity()。或者,您可以使用the method variant which takes both file names as parameters,或將它們作爲字節數組傳遞。

原因是,在SSH公鑰認證協議中,客戶端首先向服務器發送一個可用公鑰的列表,然後由服務器選擇一個合適的公鑰 - 然後只需要私鑰(和將被解密,如果需要的話)。 儘管它可以從私有密鑰計算公鑰(取決於算法和密鑰表示),但JSch本身並不這樣做,因此您必須提供兩個密鑰。

0

,因爲你正在使用

config.put("StrictHostKeyChecking", "no"); 

你不需要任何keyfiles.It禁用checking.Can告訴你什麼呢日誌已執行program.so後,我們可以幫你的hostkey。