2011-02-08 4 views
26

Sto usando JSch per la comunicazione sftp, ora voglio usare l'autenticazione basata su chiave, la chiave viene caricata sul client e sul server una volta dal mio team di rete e tutte le comunicazioni successive saranno solo basate sull'utente per cui abbiamo caricato il chiave.Possiamo usare JSch per la comunicazione basata su chiave SSH?

sftp -oPort=10022 [email protected] 

come [email protected]

come questo comando funzionano bene e connettersi alla SFTP, come posso ottenere questa funzionalità a livello di codice.

se non è possibile utilizzare JSch, suggerire qualche altra libreria. Mi sono imbattuto in Apache SSHD.

risposta

68

È possibile. Date un'occhiata a JSch.addIdentity(...)

Ciò consente di utilizzare la chiave come matrice di byte o per leggerla dal file.

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelSftp; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class UserAuthPubKey { 
    public static void main(String[] arg) { 
     try { 
      JSch jsch = new JSch(); 

      String user = "tjill"; 
      String host = "192.18.0.246"; 
      int port = 10022; 
      String privateKey = ".ssh/id_rsa"; 

      jsch.addIdentity(privateKey); 
      System.out.println("identity added "); 

      Session session = jsch.getSession(user, host, port); 
      System.out.println("session created."); 

      // disabling StrictHostKeyChecking may help to make connection but makes it insecure 
      // see http://stackoverflow.com/questions/30178936/jsch-sftp-security-with-session-setconfigstricthostkeychecking-no 
      // 
      // java.util.Properties config = new java.util.Properties(); 
      // config.put("StrictHostKeyChecking", "no"); 
      // session.setConfig(config); 

      session.connect(); 
      System.out.println("session connected....."); 

      Channel channel = session.openChannel("sftp"); 
      channel.setInputStream(System.in); 
      channel.setOutputStream(System.out); 
      channel.connect(); 
      System.out.println("shell channel connected...."); 

      ChannelSftp c = (ChannelSftp) channel; 

      String fileName = "test.txt"; 
      c.put(fileName, "./in/"); 
      c.exit(); 
      System.out.println("done"); 

     } catch (Exception e) { 
      System.err.println(e); 
     } 
    } 
} 
+0

in realtà non ho alcuna chiave, è pre caricato nel sistema dal team di rete, e ora posso connettermi al server usando il comando senza la chiave o la password. –

+1

* Precaricato nel sistema * può significare che è '.ssh/id_rsa' o simile, o che c'è un'impostazione speciale in' .ssh/config' per il tuo host, o che stai usando qualche programma come 'ssh_agent' per dare la chiave su richiesta. Scopri qual è il tuo caso e aggiungilo alla tua domanda. –

+0

Beh Caro mi ha davvero aiutato. grazie per la guida. –