Creare un client ssh e sftp in Java
Articolo scritto da Ciro Cardone
Pagina 1 di 6
Pagina 1 di 6
Ci sono molti framework che permettono di creare un client ssh in Java, come ad esempio:
Jsch è, a mio modo di vedere, semplice da utilizzare, oltre che essere usato da Eclipse, Ant e JIRA.
Per avviare la connessione ssh bisogna innanzitutto creare una session con l'host remoto:
/** * Inizializzo il framework e creo la session */ JSch jsch = new JSch(); String user = "mrwebmaster"; String host = "localhost"; int port = 22; Session session = jsch.getSession(user, host, port);Dopo aver creato la session dobbiamo creare un channel:
/**
* Setto la classe UserInfo per recupare la password dell'utente
*/
UserInfo ui = new MrWebmasterUserInfo();
session.setUserInfo(ui);
/**
* Eseguo la connessione della sessione
*/
session.connect();
/**
* Creo il channel shell
*/
ChannelShell channel = (ChannelShell) session.openChannel("shell");
Ci sono molti tipi di channel, ma in questo articolo verranno analizzati solo il channel shell e il channel sftp, si lascia al lettore un eventuale approfondimento.
Per connettersi attraverso il channel bisogna settare nella session un oggetto che implementi l'interfaccia UserInfo.
Questa interfaccia ha i seguenti metodi:
- public String getPassphrase()
- public String getPassword()
- public boolean promptPassphrase(String message)
- public boolean promptPassword(String message)
- public boolean promptYesNo(String message)
- public void showMessage(String message)
Il metodo promptYesNo viene invocato quando non è possibile verificare l'autenticità dell'host remoto, e restituisce true solo se l'utente accetta la connessione ad un host non verificato. Infine il metodo showMessage viene invocato quando deve essere mostrato un messaggio all'utente.
Una volta creato il channel non resta che legare lo stdin e stdout di java al channel ed effettuare la connessione:
/**
* Associo stdin e stdout
*/
channel.setInputStream(System.in);
/**
* per Windows
*
* channel.setInputStream(new FilterInputStream(System.in) { public
* int read(byte[] b, int off, int len) throws IOException { return
* in.read(b, off, (len > 1024 ? 1024 : len)); } });
*/
channel.setOutputStream(System.out);
/**
* Eseguo la connessione con un timeout di 3 secondi
*/
channel.connect(3000);
');







