Connexion SSH à l'aide de Java
Que j'essaie d'établir une connexion SSH à travers mon code Java, mais ci-dessous exception .. j'ai testé ma connexion via Putty/Winscp outils et il fonctionne très bien. Le problème est avec mon code Java...
SEVERE: The Transport Protocol thread failed
java.io.IOException: The socket is EOF
at com.sshtools.j2ssh.transport.TransportProtocolInputStream.readBufferedData(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolInputStream.readMessage(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.readMessage(Unknown Source)
at com.sshtools.j2ssh.transport.kex.DhGroup1Sha1.performClientExchange(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolClient.performKeyExchange(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.beginKeyExchange(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.onMsgKexInit(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.startBinaryPacketProtocol(Unknown Source)
at com.sshtools.j2ssh.transport.TransportProtocolCommon.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Ci-dessous est mon morceau de code Java pour établir la connexion
public class MySSHClient {
static SshClient ssh = null;
static SshConnectionProperties properties = null;
SessionChannelClient session = null;
private static void MySSHClient(String hostName, String userName, String passwd )
{
try
{
//Make a client connection
ssh = new SshClient();
properties = new SshConnectionProperties();
properties.setHost("192.168.1.175");
//Connect to the host
ssh.connect(properties, new IgnoreHostKeyVerification());
//Create a password authentication instance
PasswordAuthenticationClient pwd = new PasswordAuthenticationClient();
pwd.setUsername("root");
pwd.setPassword("123456");
//Try the authentication
int result = ssh.authenticate(pwd);
//Evaluate the result
if (result==AuthenticationProtocolState.COMPLETE) {
System.out.println("Connection Authenticated");
}
}
catch(Exception e)
{
System.out.println("Exception : " + e.getMessage());
}
}//end of method.
public String execCmd(String cmd)
{
String theOutput = "";
try
{
//The connection is authenticated we can now do some real work!
session = ssh.openSessionChannel();
if ( session.executeCommand(cmd) )
{
IOStreamConnector output = new IOStreamConnector();
java.io.ByteArrayOutputStream bos = new
java.io.ByteArrayOutputStream();
output.connect(session.getInputStream(), bos );
session.getState().waitForState(ChannelState.CHANNEL_CLOSED);
theOutput = bos.toString();
}
//else
//throw Exception("Failed to execute command : " + cmd);
//System.out.println("Failed to execute command : " + cmd);
}
catch(Exception e)
{
System.out.println("Exception : " + e.getMessage());
}
return theOutput;
}
public static void main(String[] args){
MySSHClient(null, null, null);
}
essayez d'utiliser jcraft.com/jsch
pour être honnête, l'exception et la posté code ne semblent pas correspondre, aussi
quelle est la version de
[root@centos-test ssh]# ssh -v localhost OpenSSH_5.3p1, OpenSSL 1.0.1 e-fips-11 Feb 2013 debug1: la Lecture des données de configuration /etc/ssh/ssh_config debug1: Application des options pour l' * debug1: la Connexion à localhost [::1] le port 22. debug1: Connexion établie. debug1: permanently_set_uid: 0/0 debug1: identité fichier /root/.ssh/identity type -1 debug1: identité fichier /root/.ssh/identity-cert type -1 debug1: identité fichier /root/.ssh/id_rsa type -1 debug1: protocole à Distance de la version 2.0, la version du logiciel à distance
pour être honnête, l'exception et la posté code ne semblent pas correspondre, aussi
execCmd
n'est pas utilisé.quelle est la version de
ssh
sur la machine linux?[root@centos-test ssh]# ssh -v localhost OpenSSH_5.3p1, OpenSSL 1.0.1 e-fips-11 Feb 2013 debug1: la Lecture des données de configuration /etc/ssh/ssh_config debug1: Application des options pour l' * debug1: la Connexion à localhost [::1] le port 22. debug1: Connexion établie. debug1: permanently_set_uid: 0/0 debug1: identité fichier /root/.ssh/identity type -1 debug1: identité fichier /root/.ssh/identity-cert type -1 debug1: identité fichier /root/.ssh/id_rsa type -1 debug1: protocole à Distance de la version 2.0, la version du logiciel à distance
OriginalL'auteur Karthick Sambanghi | 2016-02-10
Vous devez vous connecter pour publier un commentaire.
Motivation
Je suis tombé sur cette question et les réponses lors de l'enquête de l'erreur en question
java.io.IOException: The socket is EOF
. Parce que changer le code pour utiliser certains autres SSH bibliothèque Java n'est pas immédiatement possible dans mon cas, et a déclaré explication par @a3.14_Infinity n'était pas assez détaillée pour moi, je tiens à ajouter mon prendre sur elle.java.io.IOException: La prise est EOF - Pourquoi?
Parce que cette exception n'est pas très utile, j'ai d'abord essayé Wireshark pour voir ce qu'il se passe sur le fil, mais en vain. J'ai donc configuré le
sshd_config
(OpenSSH 6.9) pour ouvrir une session surDEBUG3
niveau et j'ai la réponse dans le/var/log/auth.log
fichier de ma machine de test. Il a déclaré un erreur fatale tout en essayant de négocier l'algorithme d'échange de clés avec le client SSH (Java SSH bibliothèque).Parce que le serveur SSH et le client n'a pas pu s'entendre sur une mutuelle algorithme d'échange de clés du serveur OpenSSH met fin à la connexion avec le client. En conséquence, la Java SSH code de la bibliothèque lève l'exception.
Mais pourquoi est-il arrivé?
La
sshtools.j2ssh
(sshtools : j2ssh-core : 0.2.9) de la bibliothèque de code est assez vieux et abandonnées. En commençant par OpenSSH 6.7 (sorti en octobre 2014) par défaut algorithmes et MAC ont été modifiés pour supprimer dangereux algorithmes qui comprend lablowfish-cbc
de chiffrement. Et avec OpenSSH 6.9 (publié en juin, 2015) le soutien pour le 1024 bitsdiffie-hellman-group1-sha1
échange de clé est désactivée par défaut.Lorsque vous utilisez toujours la préhistoire, les Outils SSH
j2ssh
de la bibliothèque (à Dieu ne plaise) connexion vers un nouveau serveur OpenSSH, vous obtiendrez la décrit d'erreur. Le code de la bibliothèque offre à l'diffie-hellman-group1-sha1
algorithme d'échange de clés du serveur OpenSSH qui il ne supporte pas par défaut. Ainsi, une connexion sécurisée ne peut être établie.Ne peut pas changer le code?
Si vous déménagez dans une autre Java SSH bibliothèque n'est pas immédiatement possible (mon cas), alors vous pouvez ré-activer les handicapés
diffie-hellman-group1-sha1
algorithme d'échange de clés dans la OpenSSH du fichier de configuration de serveursshd_config
. Par exemple, comme ceci.Mais permettez-moi d'être clair sur ce point. Le
diffie-hellman-group1-sha1
algorithme d'échange de clés ainsi que lesblowfish-cbc
de chiffrement sont désactivés par défaut, car ils sont anxieux. Réactivation d'entre eux ne devrait être qu'une mesure temporaire jusqu'à ce que vous pouvez remplacer ce obsolète Java SSH bibliothèque.Enfin, je tiens à souligner que les propositions de Java Secure Channel (JSch) bibliothèque dans d'autres réponses est interrompu. Donc, vous pourriez envisager de sshj ou même ssh2j-maverick à la place.Edit: j'ai eu tort, le Java Canal Sécurisé JSch bibliothèque est vivant (JSCH 0.1.54 a été publié sur 2016-09-03 sur MavenCentral) et mérite certainement votre attention. Alternativement, vous pouvez envisager également sshj ou ssh2j-maverick.
Addendum: La Migration
Pour maintenir l'effort de migration pour le
sshtools.j2ssh
(sshtools : j2ssh-core : 0.2.9) bibliothèque des minimes, j'ai regardé la commercial héritage client SSH bibliothèque de SSHTOOLS (version 1.7.1). Cela a permis de garder la bibliothèque existante du code de l'intégration avec quelques modifications mineures concernant la bibliothèque de l'API et de la gestion des exceptions. Donc, si vous ne souhaitez pas redémarrer à partir de zéro, puis mordre la balle et coller avec SSHTOOLS est probablement votre meilleure option. Enfin, pour mesurer l'effort de migration j'ai d'abord remplacé la bibliothèque avec SSHTOOLS' bibliothèque open source ssh2j-maverick qui a presque la même API que sa dernière version commerciale (version 1.7.1).OriginalL'auteur Ivo Mori
Cette erreur ("Le Protocole de Transport de fil a échoué. java.io.IOException: La prise est EOF”) se produit lorsque j2ssh.jar le fichier n'est pas compatible avec les version SSH du serveur SFTP.
Vous pouvez essayer d'utiliser Java Secure Channel (JSch) à partir de ici.
Courtoisie: http://techydiary.com/the-transport-protocol-thread-failed-java-io-ioexception-the-socket-is-eof/
Heureux que ça a aidé. Plus tard, vous pouvez accepter cette réponse 🙂
OriginalL'auteur a3.14_Infinity
L'exemple de Code suivant peut vous aider,
OriginalL'auteur Kajal