2012-06-04 13 views
31

Quindi sto scrivendo un piccolo programma che deve connettersi a un server remoto tramite SFTP, tirare giù un file e quindi elaborare il file. Mi sono imbattuto in JSch attraverso alcune risposte qui e sembrava perfetto per il compito. Finora, facile da usare e ho funzionato, con una cosa minore che mi piacerebbe aggiustare. Sto utilizzando il seguente codice per la connessione e tirare verso il basso il file:Connessione SFTP tramite Java che richiede un'autenticazione strana

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

Quindi questo funziona e ottengo il file. Sto eseguendo questo codice su un server Linux e quando eseguo il codice JSch mi chiede il mio nome utente e password Kerberos. Sembra che:

Kerberos nome utente [George]:

password di Kerberos per George:

Ho appena premi invio per entrambe le domande e poi il programma sembra continuare senza problemi. Tuttavia ho bisogno che questo codice sia automatizzato attraverso un compito cron e quindi preferirei non averlo in pausa per farmi queste due domande. C'è qualcosa che non sto fornendo in modo che non lo chieda? Qualcosa che devo fare per smettere di chiedere? Spero che qualcuno abbia qualche idea. Grazie.

+0

Ai posteri, thuis possono essere correlati a: https://issues.apache.org/bugzilla /show_bug.cgi?id=53437 – Aaron

risposta

64

Pensavo che avrei posto una risposta qui dal caso in cui qualcun altro finisce per imbattersi in un problema simile. Risulta che mi manca un pezzo di codice che fa la differenza. Avevo solo bisogno di aggiungere

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

prima

session.connect(); 

e tutto funziona perfettamente ora.

+0

+1 molto utile. Mi ha anche aiutato –

+0

questo ha funzionato magnificamente, felice anno nuovo MrGreen – raffian

+0

Mi hai salvato, grazie :) –

5

Mentre la soluzione nella risposta auto-accettata è corretta, manca qualsiasi spiegazione.

Il problema è che l'OP ha un set di autenticazione Kerberos/GSSAPI come preferito (il valore predefinito di JSch). Eppure OP non sembra effettivamente usarlo/volerlo, poiché OP sostiene di non specificare alcun nome utente o password per i prompt di Kerberos.

La soluzione è di rimuovere il Kerberos/GSSAPI (gssapi-with-mic) dall'elenco dei metodi di autenticazione preferiti:

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