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.
java ssh jsch userinfo
Commentami!