Home / Programmazione / Java / Connessione SSH con Java
Mattepuffo

Connessione SSH con Java

Connessione SSH con Java

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.