Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

SSH su Java

Un'applicazione d'esempio sull'autenticazione tramite username e password basata sulla libreria Ganymed SSH-2 for Java permetterà di capire perché SSH sia diventato ormai uno standard di fatto nelle comunicazioni sicure tra terminali remoti.
Un'applicazione d'esempio sull'autenticazione tramite username e password basata sulla libreria Ganymed SSH-2 for Java permetterà di capire perché SSH sia diventato ormai uno standard di fatto nelle comunicazioni sicure tra terminali remoti.
Link copiato negli appunti

Uno dei protocolli di rete più utilizzati da sistemisti e sviluppatori - soprattutto in ambienti Linux - è SSH (acronimo che sta per Secure Shell). Con questo sistema, infatti, è possibile accedere ad una console remota in maniera affidabile, consentendo di fatto di ottenere gli stessi risultati di Telnet, ma in modo molto più sicuro. Ad esempio, con SSH possiamo eseguire un comando su una macchina remota e leggerne gli output, nonché copiare o modificare file e cartelle.

Oltre ad essere disponibile uno svariato numero di implementazioni per qualsivoglia sistema operativo (la più nota delle quali è probabilmente OpenSSH), la maggior parte dei principali linguaggi di programmazione possono adoperare questo protocollo tramite apposito librerie. In questo articolo vedremo come utilizzare SSH con Java, sfruttando la libreria Ganymed SSH-2. Ovviamente si tratta solo di una delle possibili soluzioni; ma il suo vantaggio principale è la grande facilità di utilizzo.

Download e linking della libreria

La libreria che utilizzeremo implementa la seconda versione di SSH, poiché la prima si rivelò vulnerabile ad alcuni attacchi, e di fatto è ormai inutilizzata. Ganymed SSH-2 for Java implementa quindi SSH-2, utilizzando gli algoritmi di cifratura AES, Blowfish e 3DES, garantendo la sicurezza propria di questo protocollo e facendolo in maniera trasparente al programmatore. Inoltre, essa è Open Source e rilasciata con licenza BSD.

La prima operazione da eseguire sarà quella di scaricare la libreria dal sito di riferimento, selezionando l’ultima build disponibile. All’interno dell’archivio .zip troveremo il codice sorgente ed il file ".jar", che potremo quindi aggiungere al build path del nostro progetto Java ed iniziare a programmare.

Per semplicità, immaginiamo di creare un normale progetto Java, che chiameremo "SSHTest". Su Eclipse, una volta creato il progetto clicchiamo con il tasto destro sul suo nome, selezioniamo Build Path -> Add External Archive..., per poi selezionare il file ganymed-ssh2-buildXXX.jar (dove XXX è il numero di versione della build, nel caso specifico "210"). In questo modo avremo collegato la libreria, e potremo utilizzarla da subito. Il processo di linking della libreria al progetto risulterebbe comunque semplice anche con una IDE diversa da Eclipse.

Un primo esempio

Vediamo subito come sfruttare le potenzialità di SSH. Proveremo ad eseguire un comando sul server, effettuando una semplice autenticazione tramite username e password. A tale scopo, i passi seguenti ci consentiranno di realizzare un primo esempio:

  1. creare un oggetto Connection, al quale passeremo una stringa contenente l’hostname o l’IP del server SSH al quale vorremo connetterci;
  2. eseguire il metodo connect() dell’oggetto Connection appena citato, per effettuare la connessione al server;
  3. effettuare l’autenticazione, inviando le credenziali (username e password) tramite il metodo authenticateWithPassword();
  4. aprire una sessione (rappresentata dalla classe Session), invocando il metodo openSession() dell’oggetto Connection creato in
    precedenza;
  5. eseguire il comando, passandolo come argomento (di classe String) al metodo execCommand() della classe Session;
  6. ottenere l’output del comando tramite il metodo getStdOut() della classe Session, che potrà essere consumato con l’oggetto StreamGobbler della stessa libreria Ganymed SSH-2;
  7. chiudere la sessione, con il metodo close() dell’oggetto Session utilizzato;
  8. chiudere la connessione, con il metodo close() dell’oggetto Connection.

L’implementazione di quanto sopra descritto è riportata di seguito; come esempio, si vedrà in che modo può essere gestito il contenuto del comando ls, che mostra la lista di file e cartelle presenti nella working directory:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
// ...
public static ArrayList<String> lsViaSSH(String ip, String usr, String psw, String dir) {
	/**
	* L'oggetto seguente fungerà da contenitore per l'output
	* del comando ls che eseguiremo via SSH
	*/
	ArrayList<String> ls = new ArrayList<String>();
	try {
		//Creo l'oggetto Connection, ed avvio la connessione
		Connection conn = new Connection(ip);
		conn.connect();
		//Effettuo l'autenticazione...
		boolean isAuthenticated = conn.authenticateWithPassword(usr, psw);
		//...e verifico che sia andata a buon fine
		if (isAuthenticated == false) {
			return null;
		}
		//Creo l'oggetto Session, aprendo di fatto una sessione
		Session sess = conn.openSession();
		//Eseguo il comando...
		sess.execCommand("ls -r " + dir);
		//...e ne gestisco l'output, popolando l'ArrayList
		InputStream stdout = new StreamGobbler(sess.getStdout());
		BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
		while (true) {
			String line = br.readLine();
			if (line == null) break;
			ls.add(line);
		}
		//Chiudo la sessione..
		sess.close();
		//...e la connessione
		conn.close();
	} catch (IOException e) {
		return null;
	}
	return ls;
}

Il codice appena mostrato chiarisce quanto sia semplice utilizzare SSH in Java con Ganymed SSH-2. Ovviamente si tratta di un esempio molto semplice, ma al tempo stesso di una sorta di scheletro che può essere ampliato con tutte le altre funzionalità di SSH. Di seguito vedremo alcuni miglioramenti che possono essere apportati al codice precedente, e che consentono di utilizzarlo in situazioni più complesse.

Ti consigliamo anche