Comment faire pour exécuter et d'afficher le résultat d'une commande shell ssh avec JSch?
J'essaie d'utiliser la bibliothèque JSch - Java Canal Sécurisé établir une connexion ssh dans mon application Android, il fonctionne.
Maintenant, je voudrais exécuter une commande et récupérer le résultat.
J'ai essayé plusieurs méthodes qui fonctionne le mieux, c'est ça. Cependant, cette méthode ne fonctionne qu'en partie, car pour une raison que je ne peux pas expliquer, mon programme s'arrête à la fin de ma boucle while, mais je suis le résultat de la commande qui s'affiche dans mon journal.
Voici mon code :
public static String executeRemoteCommand(String username, String password, String hostname, int port) throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostname, port);
session.setPassword(password);
//Avoid asking for key confirmation
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
session.setConfig(prop);
session.connect();
Channel channel = session.openChannel("shell");
channel.connect();
DataInputStream dataIn = new DataInputStream(channel.getInputStream());
DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());
//send ls command to the server
dataOut.writeBytes("ls\r\n");
dataOut.flush();
//and print the response
String line = dataIn.readLine();
String result = line + "\n";
while ((line = dataIn.readLine()) != null) {
result += line + "\n";
Log.i("TAG", "Line: "+line);
}
dataIn.close();
dataOut.close();
channel.disconnect();
session.disconnect();
return result;
}
Quelqu'un d'autre a une meilleure façon d'exécuter une commande shell avec JSch?
Vous en remercie d'avance !
OriginalL'auteur lopez.mikhael | 2013-05-31
Vous devez vous connecter pour publier un commentaire.
Votre méthode s'arrête dans la boucle (au lieu de finir) parce que le shell distant ne pas fermer le flux de sortie.
Il n'a aucune raison de le faire, car là, vous pouvez l'envoyer plus de commandes.
Si vous ne souhaitez exécuter une commande unique (ou une série de commandes connu avant), vous ne devriez pas utiliser un Shell canal, mais un "exec" de canal.
De cette façon, le shell distant (qui exécute votre commande) terminera lorsque votre commande est terminée, et le serveur va fermer le flux de données. Si votre boucle sera fini, et vous pouvez ensuite fermer les volets.
Si vous pensez que vous avez besoin d'un shell de canal (par exemple, si vous avez besoin de tirer jusqu'à plusieurs commandes dans le même contexte, et de réagir à la sortie avant de décider quelle serait la suivante), vous aurez besoin d'une manière de savoir si une commande n'est pas terminée (par exemple, en reconnaissant l'invite de commandes), puis d'envoyer la suivante. Pour quitter, fermer le flux de sortie ou envoyer une "déconnexion" ou la commande "exit" (les deux fonctionnent avec n'importe quel standard du shell d'unix, d'autres obus ont besoin de différentes commandes), puis le site distant doit fermer les autres flux, trop.
Par la voie, tandis que la désactivation de la stricte vérification de la clé d'hôte est pratique, il ouvre aussi de votre connexion à un man-in-the-middle attack, et dans le cas de l'authentification par mot de passe, l'attaquant peut saisir votre mot de passe. La bonne façon de le faire est de configurer correctement initialisé de la clé d'hôte du référentiel de reconnaître l'hôte distant est la clé.
OriginalL'auteur Paŭlo Ebermann
Autant que je suis conscient JSch est la seule option.
J'ai trouvé que Jsch les erreurs ont tendance à prendre le creusement. Mais dans le premier cas, vous aurez envie de l'attraper et d'imprimer les erreurs au minimum.
ont également un coup d'oeil un exemple de code sur le site
OriginalL'auteur shainnif