Home Java Connessione SSH con Java
Connessione SSH con Java
Programmazione & Co.
Lunedì 30 Gennaio 2012 14:04

Di default Java non dispone librerie per la connessione a un srever SSH.

Ne esistono però diverse in giro.

Io ho optato per JSCH.

Attraverso questa libreria possiamo anche connetterci a un server SFTP.

Qui vedremo una semplice connessione attraverso SSH.

Scaricate la libreria e aggiungetela al vsotro progetto.

Avremo bisogno di almeno due classi: una per la connessione e una che rappresenta l'utente.

Quella per la connessione è questa:

public class SshConnection {
 
   private Session session;
   private ChannelShell channel;

   public void getConnection(String user, String host, String password, int port) throws InterruptedException, JSchException {
    JSch jsch = new JSch();
    UserInfo ui = new MyUserInfo();
    session = jsch.getSession(user, host, port); // CREO LA SESSIONE
    session.setUserInfo(ui); // IMPOSTO L'UTENTE
    session.setPassword(password); // INVIO LA PASSWORD
    session.connect(); // MI CONNETTO
    channel = (ChannelShell) session.openChannel("shell");
    channel.setInputStream(System.in); // LEGGO L'INPUT DEI COMANDI INVIATI AL OC REMOTO
    channel.setOutputStream(System.out); // LEGGO L'OUTPUT DI RISPOSTA
    channel.connect(3000); // TIMEOUT
    while (true) {
    if (channel.isClosed()) {
      System.exit(channel.getExitStatus());
    } else {
      Thread.sleep(1000);
    }
   }
  }
}

Il metodo getConnection() richiede 4 parametri, che possiamo ad esempio far inserire all'utente.

Dopo vi mostro il mio Main.

MyUserInfo() è una classe che rappresenta l'utente, e che implementa UserInfo.

Se leggete il codice vedrete che è abbastanza semplice.

La classe MyUserInfo è questa qua:

public class MyUserInfo implements UserInfo {
 
 private String password;
 
 @Override
 public String getPassphrase() {
 return null;
 }

 @Override
 public String getPassword() {
 return password;
 }

 @Override
 public boolean promptPassword(String string) {
 return true;
 }

 @Override
 public boolean promptPassphrase(String string) {
 return true;
 }

 @Override
 public boolean promptYesNo(String string) {
 return true;
 }

 @Override
 public void showMessage(String string) {
 System.out.println(string);
 }
}

Volendo i vari metodi si posso reimplementare per ottenere informazioni più dettagliate, o volendo anche per impostare la password qua invece che usando session.setPassword(password).

Questo dipende da voi.

La classe dalla quale lancio il tutto potrebbe essere una cosa del genere:

public class Main {

 public static void main(String[] args) {
 Console console = System.console();
 System.out.println("USER:");
 String user = console.readLine();
 System.out.println("HOST:");
 String host = console.readLine();
 System.out.println("PORT (default 22):");
 String port = console.readLine();
 if ("".equals(port)) {
 port = "22";
 }
 System.out.println("PASSWORD:");
 char[] cript = console.readPassword();
 String pwd = new String(cript);
 try {
 SshConnection ssh = new SshConnection();
 ssh.getConnection(user, host, pwd, Integer.parseInt(port));
 } catch (InterruptedException ex) {
 System.out.println(ex.getMessage());
 } catch (JSchException ex) {
 System.out.println(ex.getMessage());
 }
 }
}

La porta non è obbligatoria visto che la maggior parte delle volte SSH è in ascolto sulla 22 che è quella di default.

Ultimo aggiornamento Lunedì 30 Gennaio 2012 14:18