Per lo sviluppo del connettore UNIX di ConnId avevo bisogno di una buona libreria che mi permettesse di eseguire da remoto dei comandi UNIX su server remoti. Dopo aver provato diverse librerie per l'esecuzione di comandi Unix in Java, la mia scelta definitiva è caduta su vngx-jsch una libreria che, a detta dello sviluppatore, migliora la più famosa jsch.

Per lo sviluppo del connettore UNIX di ConnId avevo bisogno di una buona libreria che mi permettesse di eseguire da remoto dei comandi UNIX su server remoti.

Dopo aver provato diverse librerie per l'esecuzione di comandi Unix in Java, la mia scelta definitiva è caduta su vngx-jsch una libreria che, a detta dello sviluppatore, migliora la più famosa jsch.

Essendo il mio primo approccio con questo tipo di programmazione, potrei anche aver commesso degli errori di valutazione, ma questo che riporto è quanto ho notato effettuando diversi test.

Note

Il mio requisito da soddisfare era un semplice client ssh che mi permettesse l'esecuzione di comandi da remoto su server UNIX. Purtroppo non ho trovato una libreria che fungesse solamente da client. Di quelle testate, tutte, sono praticamente dei client in grado di emulare in tutte le sue specifiche il protocollo ssh2; questo significa per esempio, la possibilità di visualizzare una shell o di fare un scp.

Dovendo utilizzare, nel caso, anche PC personali come risorse da provisionare tramite Syncope e ConnId, nella fase di test mi sono accorto che, con un paio di librerie (ricordo sshtools), l'autenticazione non riusciva su macchine Apple.

Come eseguire comandi con vngx-jsch

Questi che riporto sono i metodi usati per l'esecuzione dei comandi UNIX su server remoti.

Il metodo getChannelExec apre una sessione ssh e ritorna un canale sul quale eseguire i comandi:

private Channel getChannelExec() throws JSchException {
              session = sshClient.createSession(username, unixConfiguration.getHostname(), unixConfiguration.getPort());
              session.connect(DefaultProperties.SSH_SOCKET_TIMEOUT, password.getBytes());
              LOG.info("Connected to host " + unixConfiguration.getHostname());
              return session.openChannel("exec");
              }

Il metodo exec che prende in input il comando da eseguire e restituisce un InputStream che rappresenta, in forma di stream, l'output generato dal comando unix:

private InputStream exec(final String command) throws JSchException, IOException {
              LOG.info("Executing command: " + command);
              final Channel channel = getChannelExec();
              ((ChannelExec) channel).setCommand(command);
              channel.setInputStream(null);
              ((ChannelExec) channel).setErrStream(System.err);
              final InputStream in = channel.getInputStream();
              channel.connect(DefaultProperties.SSH_SOCKET_TIMEOUT);
              channel.disconnect();
              return in;
              }

E infine il metodo printOutput che prendendo in input l'InputStream generato da exec lo trasforma in una stringa per la lettura da parte dell'utente finale:

private String printOutput(final InputStream inputStream) throws IOException {
              String line;
              BufferedReader br = new BufferedReader(
              new InputStreamReader(inputStream));
              StringBuilder buffer = new StringBuilder();
              while ((line = br.readLine()) != null) {
              buffer.append(line).append("\n");
              }
              session.disconnect();
              return buffer.toString();
              }
1 VOTIYes, Excellent!Yes, Excellent!
Ti è stato utile questo articolo?
Dal Blog di Tirasa
Quello che facciamo, studiamo e pensiamo tutti i giorni lo condividiamo qui.
Vai al blog >