Quelqu'un a-t-il un exemple de connexion à une bibliothèque SSH en utilisant Java ?
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).
Quelqu'un a-t-il un exemple de connexion à une bibliothèque SSH en utilisant Java ?
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.
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).
Vous devez télécharger la source à partir de sourceforge.net/projets/jsch/files/jsch/jsch-0.1.42.zip/ et lancez "ant javadoc"
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)
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();
}
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();
}
}
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.
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.
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.
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).
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.
Jetez un coup d'œil à l'édition très récente de SSHD qui est basé sur le projet Apache MINA.
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.
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.
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