2011-02-08 13 views
26

estoy usando JSch para la comunicación SFTP, ahora yo quiero usar facilitar la autenticación basada en clave, clave se carga en el cliente y el equipo servidor de una vez por mi equipo de la red y todas las comunicaciones más tarde sería único usuario en base a la cual nos hemos cargado el llave.¿Podemos usar JSch para la comunicación basada en claves SSH?

sftp -oPort=10022 [email protected] 

como [email protected]

gusta este trabajo fino de mando y conectar con el SFTP, cómo puedo conseguir esta funcionalidad mediante programación.

si no es posible utilizando JSch, por favor, sugiera alguna otra biblioteca. Me encontré con Apache SSHD.

Respuesta

68

Es posible. Echar un vistazo a JSch.addIdentity(...)

Esto le permite utilizar la tecla ya sea como matriz de bytes o leer desde un archivo.

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

En realidad, no tengo ninguna clave, está precargada en el sistema por el equipo de red, y ahora puedo conectarme al servidor utilizando el comando sin la clave o la contraseña. –

+1

* precargado en el sistema * puede decir que sea '.ssh/id_rsa' o similares, o que hay un ajuste especial en' .ssh/config' para su huésped, o que está utilizando algún programa como 'ssh_agent' a dar la clave a pedido. Explore cuál es el caso para usted y agréguelo a su pregunta. –

+0

Bien Querido, realmente me ayudó. gracias por la guía. –

Cuestiones relacionadas