Forum Programmation.java exécuter un script shell à distance avec la classe Runtime

Posté par  .
Étiquettes : aucune
0
11
mai
2005
Bonjour,

je voudrais exécuter et copier des scripts shell à distance via ssh à partir d'une interface web en utilisant la classe Runtime. A noter que je dois disposer de tous les droits pour copier des fichiers dans le repertoire etc/sysconfig (donc je dois copier avec sudo je crois).

Quelqu'un à une idée ?

Merci.
  • # Plusieurs problèmes

    Posté par  (site web personnel) . Évalué à 2.

    Il y a trois problèmes et je ne sait pas lequel te bloque

    1°) Lancer ta commande à distance avec ssh

    #ssh machinecible -l utilisateurbidule "sh ~/monscript.sh"

    pour mettre le script sur la cible exécuter avant:

    #scp monscript.sh utilisateurbidule@machinecible:~/

    pour ne pas avoir à entrer de password: http://www.debian.org/devel/passwordlessssh(...)

    2°) configuration du sudo
    Bon là c'est aussi discutable sur un plan de la sécurité mais pour avoir un sudo sans password:
    ajouter dans /etc/sudoers de la machine cible "utilisateurbidule ALL=NOPASSWD: ALL"

    3°) exécuter un process natif depuis java:


    String cmdline= "sh ~/monscript.sh"
    // démarre le process
    Process p = Runtime.getRuntime().exec(cmdline);
    // note: il existe une méthode Process exec(String command, String envp[], File dir)
    // mais si tu l'utilises tu devra récupérer manuellement tout le contexte d'exécution (variables PATH/JAVA_HOME...)

    // Initie et lance deux threads lisant sortie erreur et standard du process
    // Tu peux mettre des FileOutputStream ou System.out/System.err à la place de "null" pour voir ce qui se passe dans le script
    Thread stdTh = new InputStreamConsumerThread("STDStream", p.getInputStream(), null);
    Thread errTh = new InputStreamConsumerThread("ErrorStream", p.getErrorStream(), null);
    errTh.start();
    stdTh.start();

    // Attends la fin du process
    p.waitFor();



    Le code de la classe InputStreamConsumerThread:

    import java.io.OutputStream;
    import java.io.InputStream;
    import java.io.IOException;

    public class InputStreamConsumerThread
    extends Thread
    {

    private InputStream _in;
    private OutputStream _out;

    public InputStreamConsumerThread(ThreadGroup group, String name, InputStream in, OutputStream out)
    {
    super(group, name);
    setDaemon(true);
    if ( in == null )
    {
    throw new IllegalArgumentException("InputStream argument cannot be null");
    }
    _in = in;
    _out = out;
    }

    public InputStreamConsumerThread(String name, InputStream in, OutputStream out)
    {
    this(null, name, in, out);
    }

    public void run()
    {
    byte[] buf = new byte[512];
    int count = 0;
    try
    {
    while ( (count = _in.read(buf)) != -1 )
    {
    if ( _out != null )
    {
    _out.write(buf, 0, count);
    }
    }
    }
    catch (IOException e)
    {
    e.printStackTrace();
    }
    }
    }
    • [^] # Re: Plusieurs problèmes

      Posté par  . Évalué à -1.

      je dois executer des scripts tels que iptables, ifconfig, route donc je crois que je dois toujours me connecter sur la cible en tant que root.
      ssh root@adresse_cible

      c'est quoi l'utilité de lire les sorties des process ?
      • [^] # Re: Plusieurs problèmes

        Posté par  (site web personnel) . Évalué à 2.

        C'est écrit: sinon ça freeze, ne me demande pas pourquoi mais sous windows j'ai été obligé de faire ça pour exécuter des sriptes verbeux dans sqlplus. Si ton script a très peu de sorties tu peux essayer sans.
        En même temps ça peut être sympa d'utiliser ça pour afficher la sortie du script dans la console ou un fichier log...


        Si ça ne te pose pas de problème d'être en root tu n'as pas besoin de sudo c'est bien ça te fait un probleme de moins :-)
        • [^] # Re: Plusieurs problèmes

          Posté par  . Évalué à 0.

          mais si, j'ai besoin de la commande sudo car en accédant à mon interface, je dois stoker certains fichiers de config dans /etc/sysconfig d'ou le besoin d'executer des commandes en tant que root.

          Mais mon probleme c comment marier les commandes sudo et les fichiers à executer à distance via ssh.
          Je m'explique, supposons que j'ai généré un fichier ifcfg-eth0, je le copier dans /etc/sysconfig/network-scripts/, je dois alors créer un fichier qui permet la connexion ssh à l'hôte en question, je ne vois pas comment sera mon script shell contenant la connexion ssh et puis la copie du fichier, alors que la copie du fichier est deja faite dans la classe java, à moins que je fais la connexion ssh aussi dans la classe java.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.