web-dev-qa-db-fra.com

Pouvons-nous utiliser JSch pour la communication par clé SSH?

J'utilise JSch pour la communication sftp, maintenant je veux utiliser faciliter l'authentification par clé, la clé est chargée sur le client et la machine serveur une fois par mon équipe réseau et toutes les communications ultérieures seraient uniquement basées sur l'utilisateur pour dont nous avons chargé la clé.

sftp -oPort=10022 [email protected]

comme [email protected]

comme cette commande fonctionne bien et se connecte au sftp, comment je peux réaliser cette fonctionnalité par programme.

s'il n'est pas possible d'utiliser JSch, veuillez suggérer une autre bibliothèque. Je suis tombé sur Apache SSHD .

38
Ahmad Nadeem

C'est possible. Jetez un oeil à JSch.addIdentity(...)

Cela vous permet d'utiliser la clé sous forme de tableau d'octets ou de la lire à partir d'un fichier.

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);
        }
    }
}
87
Arnost Valicek