2013-12-13 21 views
5

Mi collego al server FTP tramite sftp (JSCH).JSCH: SFTP. Si blocca su session.connect() utilizzando la porta 21

Evertime mi connetto al server FTP utilizzando la porta 21, si blocca sempre a session.connect().

Non fa eccezione. Ma quando uso altre porte. Funziona e genera un'eccezione.

C'è un modo in cui è possibile rilevare l'errore?

Ecco un esempio del mio codice.

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

Non ci sono "altre porte". La porta 22 è la porta SSH. Port 21 certamente non lo è. – EJP

+0

so che non ci sono altre porte. Il mio problema è che mi aspettavo che generasse un'eccezione. Ma si blocca solo in session.connect() – aeycee

risposta

6

Potrebbe essere che la porta 22 è la porta predefinita per SFTP? E un server FTP in esecuzione sulla porta 21 non saprà come negoziare la conversazione per l'FTP sicuro. Fondamentalmente, SFTP è FTP su SSH.

MODIFICATO: Il problema è che è in attesa indefinitamente per il completamento della negoziazione. È uno stallo messicano senza che nessuna delle due parti si arrenda. Chiama il numero session.setTimeout() prima del session.connect() oppure chiama session.connect(timeout), con un valore adeguato (3-5 secondi). Credo che il timeout sia in millisecondi.

+0

Il mio problema è quando l'utente inserisce la porta diversa da 22. Speravo che il JSCH avrebbe lanciato un'eccezione. Il mio problema è che non genera alcun errore. Ho appena riagganciato in session.connect(). Quando uso la porta 22 posso collegarmi con successo al server ftp. – aeycee

+1

Vedere le modifiche alla risposta sopra. – brettw

+1

Grazie mille. Sta lavorando adesso. – aeycee

6

Ho avuto un problema simile ma con la porta corretta. session.connect() si blocca e non restituisce nulla. Mentre altri programmi possono connettersi con successo.

Il motivo era che l'host fornisce più metodi di autenticazione e dobbiamo indicare a Jsch di utilizzare solo la password.

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

Il mio problema era che session.connection() richiedeva fino a 40 secondi ogni volta che si collegava a SFTP, dopo aver impostato queste proprietà si collega in 1-2 secondi. –

1

stiamo correndo JSch da webMethods server. Dopo l'aggiornamento alla nuova versione quando abbiamo provato a connetterci a uno dei nostri partner, si blocca sulla fase di connessione.

La soluzione proposta qui non ha funzionato. Ho ricevuto questo errore:

com.jcraft.jsch.JSchException: Auth non riescono

ho notato il server che stiamo cercando di connettersi a sta chiedendo per l'utente e la password prima connessione è fatto:

[[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 

L'Kerberos utente e la password non dovrebbero esserci affatto.

Dopo piccola indagine ho trovato questa pagina: Skipping Kerberos authentication prompts with JSch

Dopo aver impostato PreferredAuthentications ad altri valori - tutto sta funzionando benissimo. Il codice che ho aggiunto:

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

Ecco l'esempio completo che ho - forse aiuterà qualcuno a eseguire il debug del problema:

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

Nel mio caso, solo l'aggiornamento JSch alla versione più recente (attualmente la 1.50) ha risolto il problema, sembra esserci stata un'incompatibilità nell'handshake key/auth con le versioni precedenti di JSch in combinazione con l'ultima versione di OpenSSH 7.1.x