2012-06-04 72 views
31

因此,我正在寫一個小程序,需要通過SFTP連接到遠程服務器,拉下文件,然後處理文件。我在這裏遇到了JSch的一些答案,它看起來非常適合這項任務。到目前爲止,易於使用,我有它的工作,與我想修復的一件小事。我正在使用下面的代碼來連接和拉下文件:通過Java請求奇怪的身份驗證的SFTP連接

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.cd(REMOTE_FTP_DIR); 
     sftpChannel.lcd(INCOMING_DIR); 
     sftpChannel.get(TMP_FILE, TMP_FILE); 
     sftpChannel.exit(); 
     session.disconnect(); 
    } catch (JSchException e) { 
     e.printStackTrace(); 
    } catch (SftpException e) { 
     e.printStackTrace(); 
    } 

所以這個工程,我得到的文件。我在linux服務器上運行這段代碼,當我運行代碼時,JSch會詢問我的Kerberos用戶名和密碼。它看起來像:

的Kerberos用戶名[喬治]:

Kerberos口令喬治:

我只需點擊進入這兩個問題,然後程序似乎繼續,沒有任何問題。不過,我需要通過cron任務來自動執行此代碼,所以我寧願不讓它暫停程序來問我這兩個問題。有沒有我不提供它,所以它不會問這個?我需要做些什麼來阻止它的問題?希望有人有一些想法。謝謝。

+0

對於後代,的Thuis可以涉及:https://issues.apache.org/bugzilla /show_bug.cgi?id=53437 – Aaron

回答

64

以爲我會在這裏發佈一個答案,因爲如果任何人最終遇到類似的問題。事實證明,我錯過了一小段代碼,它使所有不同。我只是需要之前

session.connect(); 

添加

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

和現在的一切完美的作品。

+0

+1非常有用。它也幫助我 –

+0

這工作很好,新年快樂:-D – raffian

+0

你救了我,謝謝:) –

5

雖然自我接受的答案中的解決方案是正確的,但它沒有任何解釋。

問題是,OP將Kerberos/GSSAPI身份驗證設置爲首選(JSch默認設置)。然而,OP似乎並未實際使用/需要它,因爲OP聲稱不會爲Kerberos提示指定任何用戶名或密碼。

的解決方案是從優選的認證方法的列表中刪除的Kerberos/GSSAPI(gssapi-with-mic):

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