Bonjour à tous,
j'ai commencé à travailler sur un programme qui se connecterait automatiquement et régulièrement à distance sur des postes client afin de lister les utilisateurs connectés.
L'authentification se fait au moyen d'une clé privée (sans passphrase). La commande que je souhaite exécuter: /usr/bin/ssh <user>@<host> "who;exit;".
Rien à signaler quand je lance cette commande depuis le shell, ça marche.
Il ne me reste qu'à la lancer depuis mon programme Java. Pour ça j'utilise la classe Runtime. Je ne conserve que les flux d'entrée et d'erreur du processus lancé. Le flux en sortie est immédiatement fermé. Les deux flux sont manipulés par deux threads dédiés à cette tâche; ils se contentent d'afficher les données qu'ils reçoivent.
J'ai fait un essai avec la commande /bin/ls. La liste des fichiers contenus dans le répertoire courant s'affiche sans problème.
Les ennuis arrivent que je tente la connexion à distance en faisant:
Process processus = runtime.exec(new String[] { "/usr/bin/ssh", "<user>@<host>", "\"who;exit;\"" });
En fait aucune exception n'est levée, et je ne reçois aucune données provenant des deux flux, alors que je devrais avoir une liste des utilisateurs connectés.
Voici le code que j'utilise:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 Runtime runtime = Runtime.getRuntime(); final Process processus = runtime.exec(new String[] { "/usr/bin/ssh", "<user>@<host>", "\"who;exit;\"" }); processus.getOutputStream().close(); // thread pour l'entrée (donc la sortie de ssh) new Thread(new Runnable() { public void run() { try { StringBuffer buffer = new StringBuffer(); BufferedReader in = new BufferedReader(new InputStreamReader(processus.getInputStream())); System.out.println("BEGIN LECTURE"); String ligne; try { while ((ligne = in.readLine()) != null) { System.out.println("LIGNE LUE"); buffer.append(ligne + "\n"); } } finally { System.out.println("END LECTURE"); in.close(); } System.out.println("ip: " + ip + " => " + buffer.toString()); } catch (IOException e) { e.printStackTrace(); } } }).start(); // thread pour le flux d'erreur new Thread(new Runnable() { public void run() { try { StringBuffer buffer = new StringBuffer(); BufferedReader in = new BufferedReader(new InputStreamReader(processus.getErrorStream())); try { while (in.ready()) buffer.append(in.readLine() + "\n"); } finally { in.close(); } System.out.println("ip erreur: " + ip + " => " + buffer.toString()); } catch (IOException e) { e.printStackTrace(); } } }).start(); processus.waitFor(); processus.destroy(); System.out.println("FIN");Merci d'avance à ceux qui auront l'amabilité de jeter un oeil sur mon problèmeEt voici le résultat que j'obtiens:
BEGIN LECTURE
ip erreur: <ip> =>
END LECTURE
ip: <ip> =>
FIN![]()
Partager