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

avec Java Discussion :

Executer un shell d'une machine distante


Sujet :

avec Java

  1. #1
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut Executer un shell d'une machine distante
    Bonjour,

    Mon application doit lancer un shell qui est sur le serveur.
    comment dois-je indiquer l'adresse de cette machine pour faire excuter son shell ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            // Exécute la commande.
            final Runtime runtime = Runtime.getRuntime();
            try {
                this.process = runtime.exec(command, null, this.workDirectory);
    Je pensais que le File dir (this.workDirectory) pouvait me servir, est-ce que l'adresse IP suivi des repertoires est la bonne syntaxe

    Merci
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Runtime permet d'exécuter des programmes en local uniquement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Je pensais comme toi ,et je viens de lire :
    String[] command = {"/etc/ssh", "myUser@remoteServer", "runprog.ksh 'param1'"};
    final Process process = Runtime.getRuntime().exec(command);
    Il semblerai que dans la command on puisse indiquer la machine distante
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bah ssh tourne sur la machine locale, donc ça marchera.

    Toutefois si tu veux faire du ssh je te conseille plutôt d'utiliser un API prévue pour ça, ce sera plus propre que du Runtime dégueu et non portable. Par exemple jsch.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    C'etait un exemple, je cherche juste à lancer un shell macommande.sh qui se trouve sur un serveur unix.
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Pour agir à distance il te faut passer soit par telnet soit par ssh (ou tout autre protocole de prise de commande à distance).

    Via ce protocole tu pourras exécuter une commande sur le serveur.
    Par défaut Windows ne propose que du telnet qui n'est pas un protocole franchement sécurisé par rapport à du ssh. Sachant que ssh n'est pas présent par défaut sous windows, je te recommande très fort d'utiliser l'API que je cite dans mon précédent message.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    La solution du simple Runtime.exec() n'est pas suffisante car il faudra gérer les messages interactifs que va t'envoyer le processus ssh comme la demande de validation de la clé du serveur ou le mot de passe.
    On peut certes résoudre ces problème mais ça sera au final plus compliqué et vraiment pas élégant.

    C'est pour cela que je te conseille, tout comme sinok, d'utiliser la bibliothèque jsch. Elle te permettra d'utiliser ssh de manière propre.

  8. #8
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    Sur le serveur UNIX faut-il installer et configurer un serveur ssh, la mise en place du "canal sécurisé" est-elle gérée automatiquement?

    Je cherche aussi un lien sur un tutorial l'utilisation de la classe TelnetClient (Package org.apache.commons.net.telnet)

    Merci
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  9. #9
    Membre confirmé Avatar de totoche
    Inscrit en
    Janvier 2004
    Messages
    1 090
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 090
    Points : 558
    Points
    558
    Par défaut
    A petit pas j'avance...
    Je fais une connection telnet sur mon serveur, je lui transmets les identifiants de connexion et une commande ls, mais l'affichage du dernier System.out.println(sb.toString()) sur la console ne m'ecrit rien, alors que sb.append((char) i); System.out.println(sb.toString()); m'écrit :
    ÿ
    ÿý
    ÿý
    ÿýÿ
    ÿýÿý
    ÿýÿý
    ÿýÿýÿ
    ÿýÿýÿý
    ÿýÿýÿý#
    ÿýÿýÿý#ÿ
    ÿýÿýÿý#ÿý
    ÿýÿýÿý#ÿý'
    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
     
    try {
     
          Socket socket = new Socket("192.168.1.1", 23);
     
          System.out.println("Connected to " + socket.getInetAddress() + " on port "
              + socket.getPort() + " from port " + socket.getLocalPort() + " of "
              + socket.getLocalAddress());
     
     
          OutputStream os = socket.getOutputStream();
          boolean autoflush = true;
          PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush);
     
     
          BufferedReader in = new BufferedReader(
          new InputStreamReader(socket.getInputStream()));
     
          // envoi des identifants et de la commande
          out.println("leCompte");
          out.println("leMotDePasse");
          out.println("ls");
          out.println();
     
        // read the response
          boolean loop = true;
          StringBuilder sb = new StringBuilder(8096);
          while (loop) {
            if (in.ready()) {
                System.out.println("on écrit");
              int i = 0;
              while (i != -1) {
                i = in.read();
                sb.append((char) i);
              System.out.println(sb.toString());     
              loop = false;
            }
          }
     
          // display the response to the out console
          System.out.println(sb.toString());
          socket.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
    Merci de votre aide
    La patience est un arbre aux racines amères, mais aux fruits ci-doux.

  10. #10
    Membre éprouvé
    Avatar de kmdkaci
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 560
    Points : 950
    Points
    950
    Par défaut Executer un shell d'une machine distante
    Bonjour,
    Une autre façon de lancer des shells sur le serveur est la suivante :
    Si j'ai besoin de lancer un shell X sur le serveur, j'envoie un fichier simple, comme valider.txt qui peut être vide. Et j'ajoute un contrôle au shell. Si le fichier existe le shell sera lancé puis le fichier effacé. L'inconvénient, cela nous amène à ce que un shell de contrôle tourne en permanence. Cette solution est adéquate si un shell se lance régulièrement. Sous LInux Cron le fait bien.

  11. #11
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 562
    Points : 15 493
    Points
    15 493
    Par défaut
    mdkaci> Certes mais pour envoyer le fichier, il faudra toujours passer par un protocole comme ftp. Donc au final ce sera au moins aussi compliqué.

    totoche> J'ai l'impression que tu te connectes directement en telnet sur un java.net.Socket classique? Passe plutôt par la classe org.apache.commons.net.telnet.TelnetClient dont tu parlais dans ton post précédent.

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

Discussions similaires

  1. [Shell scripting] problème de connexion sur une machine distante
    Par Antheadousa dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 03/07/2014, 12h10
  2. Execution de l'.exe sur une machine distante
    Par justinedr71 dans le forum Exécution et industrialisation
    Réponses: 8
    Dernier message: 24/05/2011, 14h21
  3. Réponses: 2
    Dernier message: 01/04/2010, 21h25
  4. Execution d'un class Java sur une machine distante (RMI ?)
    Par hassanJava dans le forum Langage
    Réponses: 4
    Dernier message: 24/12/2008, 16h33
  5. Réponses: 1
    Dernier message: 01/02/2007, 12h51

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