12
votes

Envoi de commandes au serveur distant via SSH par Java avec JSCH

J'essaie de configurer une classe de sorte que je puisse ssh dans un serveur distant (j'ai l'IP, le nom d'utilisateur et le mot de passe), puis envoyez une commande comme "ECHO" TEST "" puis recevez la sortie. (par exemple, "test"). J'utilise JSCH pour le faire, 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();

             ...


0 commentaires

4 Réponses :


2
votes

Je suggère de regarder l'exemple caché sur le site Web de JCRACT: http: // www .jcraft.com / jsch / exemples / useraudki.java

Leur exemple des invites pour le nom d'utilisateur, le nom d'hôte, le mot de passe, il est donc prêt à tester hors de la boîte. Je l'ai rencontré sur mon réseau et j'ai pu se connecter à un serveur Aix sans changer de code.

Note, leur exemple a un problème (cela peut être pourquoi il est caché) .. il ne ferme jamais le canal. Si vous envoyez 'EXIT', le serveur vous déconnectera, mais l'objet de la chaîne reste ouvert et votre programme Java ne quitte jamais. J'ai fourni une solution pour cela ici: Ne jamais finir Réponse du serveur de lecture à l'aide de JSCH


0 commentaires

25
votes

Essayez ceci:

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();


2 commentaires

Comment exécuter plusieurs commandes comme si je veux exécuter "CD xx / xx / xx", puis cochez "PWD"


Vous avez ma réponse ici: stackoverflow.com/ Questions / 5831594 / ... , merci



9
votes

La réponse de Shamnu ci-dessus avait raison. Je ne pouvais pas y ajouter de commentaire, alors voici quelques exemples pour améliorer sa réponse. On est de savoir comment faire une exécution à distance de 'LS -L', une autre de 'MKDir', et une autre d'une copie locale à distance. Tout 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();    
  }


1 commentaires

Juste une note, si tout ce que vous faites est des opérations de fichier, vous pouvez utiliser canalelsftp qui fournit des méthodes telles que CD (), MKDIR () et Met ().



-1
votes
 1. List item

import java.io.InputStream;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class SSHCommandExecutor {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String host="10.75.81.21";
        String user="root";
        String password="Avaya_123";
        String command1="ls -l";
        try{

            java.util.Properties config = new java.util.Properties(); 
            config.put("StrictHostKeyChecking", "no");
            JSch jsch = new JSch();
            Session session=jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.setConfig(config);
            session.connect();
            System.out.println("Connected");

            Channel channel=session.openChannel("exec");
            ((ChannelExec)channel).setCommand(command1);
            channel.setInputStream(null);
            ((ChannelExec)channel).setErrStream(System.err);

            InputStream in=channel.getInputStream();
            channel.connect();
            byte[] tmp=new byte[1024];
            while(true){
              while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
              }`enter code here`
              if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
              }
              try{Thread.sleep(1000);}catch(Exception ee){}
            }
            channel.disconnect();
            session.disconnect();
            System.out.println("DONE");
        }catch(Exception e){
            e.printStackTrace();
        }

    }


 1. List item

}

1 commentaires

Pouvez-vous s'il vous plaît élaborer sur votre solution?