• # Plusieurs problèmes

    Posté par (site web personnel) . En réponse au message exécuter un script shell à distance avec la classe Runtime. É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();
    }
    }
    }