197 votes

Bibliothèque SSH pour Java

Quelqu'un a-t-il un exemple de connexion à une bibliothèque SSH en utilisant Java ?

0 votes

J'avais l'habitude d'utiliser Trilead SSH mais quand j'ai vérifié le site aujourd'hui, il semble qu'ils l'abandonnent :( C'était mon préféré.

1 votes

BTW, il semble que Trilead SSH2 soit activement maintenu (en Oct 2013) : [ [github.com/jenkinsci/trilead-ssh2]](https://github.com/jenkinsci/trilead-ssh2])

0 votes

Trilead SSH2 a une fourche à github.com/connectbot/sshlib

130voto

David Rabinowitz Points 14133

Le site Canal sécurisé Java (JSCH) est une bibliothèque très populaire, utilisée par maven, ant et eclipse. Elle est open source avec une licence de type BSD.

1 votes

Cela semble bien - y a-t-il des javadocs pour cela ? Les exemples sont du code swing quelque peu mal écrit (d'après le bref échantillonnage que j'ai fait).

2 votes

Vous devez télécharger la source à partir de sourceforge.net/projets/jsch/files/jsch/jsch-0.1.42.zip/ et lancez "ant javadoc"

77 votes

J'ai essayé d'utiliser JSch il y a quelques temps et je n'arrive pas à comprendre comment il est devenu si populaire. Il n'offre absolument aucune documentation (même pas dans la source) et une conception d'API horrible ( techtavern.wordpress.com/2008/09/30/ résume assez bien la situation)

69voto

miku Points 63392

Mise à jour : Le projet GSOC et le code qu'il contient ne sont pas actifs, mais ceci l'est : https://github.com/hierynomus/sshj

hierynomus a pris le relais en tant que mainteneur depuis début 2015. Voici l'ancien lien Github, qui n'est plus maintenu :

https://github.com/shikhar/sshj


Il y avait un projet GSOC :

http://code.google.com/p/commons-net-ssh/

La qualité du code semble être meilleure que celle de JSch qui, bien qu'étant une implémentation complète et fonctionnelle, manque de documentation. La page du projet annonce une version bêta à venir, le dernier commit dans le dépôt date de mi-août.

Comparez les API :

http://code.google.com/p/commons-net-ssh/

    SSHClient ssh = new SSHClient();
    //ssh.useCompression(); 
    ssh.loadKnownHosts();
    ssh.connect("localhost");
    try {
        ssh.authPublickey(System.getProperty("user.name"));
        new SCPDownloadClient(ssh).copy("ten", "/tmp");
    } finally {
        ssh.disconnect();
    }

http://www.jcraft.com/jsch/

Session session = null;
Channel channel = null;

try {

JSch jsch = new JSch();
session = jsch.getSession(username, host, 22);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(password);
session.connect();

// exec 'scp -f rfile' remotely
String command = "scp -f " + remoteFilename;
channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command);

// get I/O streams for remote scp
OutputStream out = channel.getOutputStream();
InputStream in = channel.getInputStream();

channel.connect();

byte[] buf = new byte[1024];

// send '\0'
buf[0] = 0;
out.write(buf, 0, 1);
out.flush();

while (true) {
    int c = checkAck(in);
    if (c != 'C') {
        break;
    }

    // read '0644 '
    in.read(buf, 0, 5);

    long filesize = 0L;
    while (true) {
        if (in.read(buf, 0, 1) < 0) {
            // error
            break;
        }
        if (buf[0] == ' ') {
            break;
        }
        filesize = filesize * 10L + (long) (buf[0] - '0');
    }

    String file = null;
    for (int i = 0;; i++) {
        in.read(buf, i, 1);
        if (buf[i] == (byte) 0x0a) {
            file = new String(buf, 0, i);
            break;
        }
    }

    // send '\0'
    buf[0] = 0;
    out.write(buf, 0, 1);
    out.flush();

    // read a content of lfile
    FileOutputStream fos = null;

    fos = new FileOutputStream(localFilename);
    int foo;
    while (true) {
        if (buf.length < filesize) {
            foo = buf.length;
        } else {
            foo = (int) filesize;
        }
        foo = in.read(buf, 0, foo);
        if (foo < 0) {
            // error
            break;
        }
        fos.write(buf, 0, foo);
        filesize -= foo;
        if (filesize == 0L) {
            break;
        }
    }
    fos.close();
    fos = null;

    if (checkAck(in) != 0) {
        System.exit(0);
    }

    // send '\0'
    buf[0] = 0;
    out.write(buf, 0, 1);
    out.flush();

    channel.disconnect();
    session.disconnect();
}

} catch (JSchException jsche) {
    System.err.println(jsche.getLocalizedMessage());
} catch (IOException ioe) {
    System.err.println(ioe.getLocalizedMessage());
} finally {
    channel.disconnect();
    session.disconnect();
}

}

2 votes

Merci. J'ai utilisé le code d'Apache SSHD (qui offre une API asynchrone) comme semence, ce qui a donné un coup de pouce au projet.

1 votes

Super. J'ai commencé un projet en utilisant JSch, mais j'aimerais vraiment changer, si j'entends plus de commentaires positifs sur commons-net-ssh.

6 votes

J'aurais dû mentionner que j'étais l'étudiant du GSOC :)

28voto

Ed Brannin Points 2723

Je viens de découvrir sshj qui semble avoir une API beaucoup plus concise que JSCH (mais il nécessite Java 6). La documentation se résume pour l'instant à des exemples dans le répertoire, ce qui me suffit généralement pour aller voir ailleurs, mais elle semble suffisamment bonne pour que je tente ma chance sur un projet que je viens de commencer.

4 votes

SSHJ est réellement utilisable par quelqu'un du monde extérieur. JSCH est un fouillis de mauvaise documentation et de conception d'API avec des dépendances cachées et largement indéchiffrables. À moins que vous ne vouliez passer beaucoup de temps à parcourir du code pour essayer de comprendre ce qui se passe, utilisez SSHJ (et j'aimerais être dur ou facétieux à propos de JSCH, vraiment).

2 votes

Oui, sshj. Tout ce que j'ai essayé avec ça a fonctionné : SCP, exécution de processus à distance, redirection de port local et distant, proxy d'agent avec jsch-agent-proxy . JSCH était un désordre.

1 votes

Le problème avec SSHJ est qu'il est très difficile d'exécuter des commandes multiples. SSHJ peut être génial pour les commandes de type "feu et oublie", mais c'est une plaie si vous voulez programmer des interactions plus complexes. (Je viens de perdre une demi-journée sur ce sujet)

19voto

lupefiasco Points 1731

Jetez un coup d'œil à l'édition très récente de SSHD qui est basé sur le projet Apache MINA.

2 votes

Je l'utilise, mais il y a un manque de documentation et d'exemples.

0 votes

On dirait un manque de documentation, c'est le moins qu'on puisse dire :/

5voto

Scott Points 671

Il y a une toute nouvelle version de Jsch sur github : https://github.com/vngx/vngx-jsch Parmi les améliorations, citons : une javadoc complète, des performances accrues, une meilleure gestion des exceptions et un meilleur respect des spécifications RFC. Si vous souhaitez contribuer de quelque manière que ce soit, veuillez ouvrir un dossier ou envoyer une demande de modification.

4 votes

Dommage qu'il n'y ait pas eu de nouvel engagement depuis plus de 3 ans maintenant.

0 votes

@Scott Où puis-je trouver des exemples pour commencer à travailler ? Aidez-moi, s'il vous plaît.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X