IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Connexion ssh depuis un programme Java


Sujet :

Entrée/Sortie Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut Connexion ssh depuis un programme Java
    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");
    Et voici le résultat que j'obtiens:
    BEGIN LECTURE
    ip erreur: <ip> =>
    END LECTURE
    ip: <ip> =>
    FIN
    Merci d'avance à ceux qui auront l'amabilité de jeter un oeil sur mon problème

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Le mieux serait d'utiliser une API Java qui permet de faire du SSH sans passer par un appel système:
    http://www.ganymed.ethz.ch/ssh2/

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut
    Bah je sens que c'est ce qui va se passer, mais je suis frustré de ne pas comprendre d'où vient le problème

    Merci pour le lien en tout cas ^^

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    juste pour t'enlever un peu de frustration, je dirais qu'il est nettement préférable de passer par une API (comme celle donné par Nudger) plutôt que de faire des appel par ligne de commande.
    En effet, tu aura une meilleur portabilité de ton code, car il pourra aussi fonctionner sur windows et pas uniquement sur Unix

    Pour ma part je ne connais pas ganymed ssh2 mais j'ai utilisé Jsch et il fonctionne très bien.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2009
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 81
    Par défaut
    C'est entendu alors, merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/01/2007, 12h11
  2. Lancer un programme java depuis un programme java
    Par TheBAT dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 06/01/2007, 16h45
  3. Imprimer directement depuis un programme java
    Par ptr83 dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2006, 15h44
  4. Réponses: 5
    Dernier message: 20/02/2006, 14h11
  5. Problème sur la commande COPY depuis un programme Java
    Par klereth dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 10/02/2006, 14h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo