Eseguire script remoti tramite SSH e Java

Mattepuffo's logo
Eseguire script remoti tramite SSH e Java

Eseguire script remoti tramite SSH e Java

Oggi vediamo come eseguire degli script remoti tramite SSH e Java.

Daremo per scontato che SSH sia installato e configurato.

Lo script sarà una cosa del genere:

$ cat /opt/script/test.sh
#! /bin/sh

echo "Il tuo nome è $1n";

Testatelo per vedere se funziona con l'utente con il quale vi connetete:

$ sh test.sh MATTEO
Il tuo nome è MATTEO

Per la connessione tramite Java usremo JSch, che potete installare tramite Maven:

        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>

Questo il codice:

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import java.io.IOException;
import java.io.InputStream;

public class Main {

    public static void main(String[] args) {
        try {
            String REMOTE_HOST = "";
            String USERNAME = "";
            String PASSWORD = "";
            int REMOTE_PORT = 22;
            int SESSION_TIMEOUT = 10000;
            int CHANNEL_TIMEOUT = 5000;
            String remoteShellScript = "/opt/script/test.sh";

            JSch jsch = new JSch();
            Session jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
            jschSession.setConfig("StrictHostKeyChecking", "no");
            jschSession.setPassword(PASSWORD);
            jschSession.connect(SESSION_TIMEOUT);

            ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec");
            channelExec.setCommand("sh " + remoteShellScript + " MATTEO");
            channelExec.setErrStream(System.err);

            InputStream in = channelExec.getInputStream();
            channelExec.connect(CHANNEL_TIMEOUT);

            byte[] tmp = new byte[1024];
            while (true) {
                while (in.available() > 0) {
                    int i = in.read(tmp, 0, 1024);
                    if (i < 0) break;
                    System.out.print(new String(tmp, 0, i));
                }
                if (channelExec.isClosed()) {
                    if (in.available() > 0) continue;
                    System.out.println("exit-status: " + channelExec.getExitStatus());
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (Exception ee) {
                }
            }

            channelExec.disconnect();
            jschSession.disconnect();
        } catch (JSchException | IOException e) {
            System.out.println(e.getMessage());
        }
    }
}

Dovete solo:

  • impostare le credenziali
  • impostare il server
  • impostare il path dello script; il path remoto ovviamente

Inoltre, facendo il test da client Windows tenete presente che sarebbe meglio fare questo:

jsch.setKnownHosts("/home/UTENTE/.ssh/known_hosts");
//jschSession.setConfig("StrictHostKeyChecking", "no");

Enjoy!


Share this Post

Commentami!