web-dev-qa-db-fra.com

Envoi de commandes au serveur distant via ssh par Java avec JSch

J'essaie de mettre en place une classe afin que je puisse ssh dans un serveur distant (j'ai l'IP, le nom d'utilisateur et le mot de passe), puis j'envoie une commande comme "echo" test "", puis je reçois la sortie (par exemple, "tester"). J'utilise JSch pour cela, mais je ne comprends pas comment le faire.

import com.jcraft.jsch.*;

public class ConnectSSH {

public int execute (String command) {

    JSch jsch   = new JSch();
    String ip   = "00.00.00.00;
    String user = "root";
    String pass = "password";
    int port    = 22;

    try {                
        Session session = jsch.getSession(user, ip, port);   
        session.setPassword(pass);
        session.connect();

             ...

Je ne sais pas quoi faire, je suis bloqué après la connexion.

Tout conseil est grandement appréciée.

12
snario

Essaye ça:

JSch jsch=new JSch();
Session session=jsch.getSession(remoteHostUserName, RemoteHostName, 22);
session.setPassword(remoteHostpassword);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();

ChannelExec channel=(ChannelExec) session.openChannel("exec");
BufferedReader in=new BufferedReader(new InputStreamReader(channel.getInputStream()));
channel.setCommand("pwd;");
channel.connect();

String msg=null;
while((msg=in.readLine())!=null){
  System.out.println(msg);
}

channel.disconnect();
session.disconnect();
25
Sainse

la réponse de shamnu ci-dessus était juste. Je n'ai pas pu ajouter de commentaire, alors voici quelques exemples pour améliorer sa réponse. L'une consiste à exécuter à distance "ls -l", une autre à "mkdir" et une autre à copier localement à distance. Tout est fait avec la version 0.1.51 de jsch ( http://www.jcraft.com/jsch/ ).

  public void remoteLs() throws JSchException, IOException {
    JSch js = new JSch();
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
    s.setPassword("mypassword");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("exec");
    ChannelExec ce = (ChannelExec) c;

    ce.setCommand("ls -l");
    ce.setErrStream(System.err);

    ce.connect();

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }

    ce.disconnect();
    s.disconnect();

    System.out.println("Exit code: " + ce.getExitStatus());

  }



  public void remoteMkdir() throws JSchException, IOException {
    JSch js = new JSch();
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
    s.setPassword("mypassword");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("exec");
    ChannelExec ce = (ChannelExec) c;

    ce.setCommand("mkdir remotetestdir");
    ce.setErrStream(System.err);

    ce.connect();

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }

    ce.disconnect();
    s.disconnect();

    System.out.println("Exit code: " + ce.getExitStatus());

  }

  public void remoteCopy() throws JSchException, IOException, SftpException {
    JSch js = new JSch();
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
    s.setPassword("mypassword");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("sftp");
    ChannelSftp ce = (ChannelSftp) c;

    ce.connect();

    ce.put("/home/myuser/test.txt","test.txt");

    ce.disconnect();
    s.disconnect();    
  }
9
gageorge

Je suggère de regarder l'exemple caché sur le site Web de JCraft: http://www.jcraft.com/jsch/examples/UserAuthKI.Java

Leur exemple demande le nom d'utilisateur, le nom d'hôte, le mot de passe, il est donc prêt à être testé hors de la boîte. Je l'ai exécuté sur mon réseau et j'ai pu me connecter à un serveur AIX sans changer de code.

Remarque, leur exemple a un problème (c'est peut-être pourquoi il est masqué) .. il ne ferme jamais le canal. Si vous envoyez "exit", le serveur vous déconnectera, mais l'objet canal reste ouvert et votre programme Java ne se termine jamais. J'ai fourni un correctif pour cela ici: Jamais de fin de lecture de la réponse du serveur à l'aide de jSch

2
Damienknight