Maison  >  Article  >  Java  >  Introduction détaillée à l'explication détaillée de Java et à un exemple de code de connexion au serveur via ssh pour exécuter des commandes shell

Introduction détaillée à l'explication détaillée de Java et à un exemple de code de connexion au serveur via ssh pour exécuter des commandes shell

黄舟
黄舟original
2017-03-08 10:33:421777parcourir

Cet article présente principalement l'explication détaillée et des exemples de méthodes de connexion de Java au serveur via ssh pour exécuter des commandes shell

Java se connectant au serveur via ssh pour exécuter des commandes shell en détail

Java se connecte au serveur via ssh pour exécuter des commandes shell : JSch est une implémentation Java pure de SSH2. Il vous permet de vous connecter à un serveur SSHD, d'utiliser la redirection de port, la redirection X11, les transferts de fichiers et bien plus encore. Vous pouvez intégrer ses fonctionnalités dans vos propres programmes. Parallèlement, le projet propose également une version J2ME pour une connexion directe au serveur SSHD sur le téléphone mobile.

SSH est l'abréviation de Secure Shell, un protocole de sécurité basé sur la couche application et la couche transport. SSH crypte toutes les données pendant le processus de connexion et de transmission et peut être utilisé pour établir des connexions sécurisées entre différents systèmes ou serveurs. SSH propose deux méthodes d'authentification de sécurité : l'authentification par mot de passe et l'authentification par clé. Parmi eux, l'authentification par mot de passe est relativement simple. Tant que vous connaissez le nom d'utilisateur et le mot de passe de l'hôte distant, vous pouvez vous connecter. L'authentification par clé est plus gênante et la connexion prend plus de temps, nous ne la présenterons donc pas en détail ici.

Il existe de nombreux clients basés sur le protocole SSH, tels que : PuTTY, OpenSSH, Xshell 4, etc., qui peuvent se connecter à distance à presque toutes les plateformes UNIX. En même temps, vous pouvez vous connecter à un hôte via la ligne de commande Linux ssh uername@host.

Dans le projet, comment utiliser le code pour implémenter SSH et exécuter le script Shell à distance ? JSch est l'abréviation de Java Secure Channel. Il s'agit d'une implémentation purement Java de la fonction SSH2. Pour des informations spécifiques, veuillez vous référer au site officiel de JSch. Il vous permet de vous connecter à un serveur SSH et d'utiliser la redirection de port, la redirection X11, le transfert de fichiers, etc., et vous pouvez également intégrer ses fonctionnalités dans vos propres applications. Avant utilisation, vous devez télécharger et importer le package JSch : jsch-0.1.50.jar.

Exemple de programme

package com.stormma.demo;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
 
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
 
public class Shell {
  //远程主机的ip地址
  private String ip;
  //远程主机登录用户名
  private String username;
  //远程主机的登录密码
  private String password;
  //设置ssh连接的远程端口
  public static final int DEFAULT_SSH_PORT = 22; 
  //保存输出内容的容器
  private ArrayList<string> stdout;
 
  /**
   * 初始化登录信息
   * @param ip
   * @param username
   * @param password
   */
  public Shell(final String ip, final String username, final String password) {
     this.ip = ip;
     this.username = username;
     this.password = password;
     stdout = new ArrayList<string>();
  }
  /**
   * 执行shell命令
   * @param command
   * @return
   */
  public int execute(final String command) {
    int returnCode = 0;
    JSch jsch = new JSch();
    MyUserInfo userInfo = new MyUserInfo();
 
    try {
      //创建session并且打开连接,因为创建session之后要主动打开连接
      Session session = jsch.getSession(username, ip, DEFAULT_SSH_PORT);
      session.setPassword(password);
      session.setUserInfo(userInfo);
      session.connect();
 
      //打开通道,设置通道类型,和执行的命令
      Channel channel = session.openChannel("exec");
      ChannelExec channelExec = (ChannelExec)channel;
      channelExec.setCommand(command);
 
      channelExec.setInputStream(null);
      BufferedReader input = new BufferedReader(new InputStreamReader
          (channelExec.getInputStream()));
 
      channelExec.connect();
      System.out.println("The remote command is :" + command);
 
      //接收远程服务器执行命令的结果
      String line;
      while ((line = input.readLine()) != null) { 
        stdout.add(line); 
      } 
      input.close(); 
 
      // 得到returnCode
      if (channelExec.isClosed()) { 
        returnCode = channelExec.getExitStatus(); 
      } 
 
      // 关闭通道
      channelExec.disconnect();
      //关闭session
      session.disconnect();
 
    } catch (JSchException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return returnCode;
  }
  /**
   * get stdout
   * @return
   */
  public ArrayList<string> getStandardOutput() {
    return stdout;
  }
 
  public static void main(final String [] args) { 
    Shell shell = new Shell("xxx.xxx.xxx.xxx", "username", "password");
    shell.execute("uname -s -r -v");
 
    ArrayList<string> stdout = shell.getStandardOutput();
    for (String str : stdout) { 
      System.out.println(str); 
    } 
  } 
}

MyUserInfo

package com.stormma.demo;
 
import com.jcraft.jsch.UserInfo;
 
public class MyUserInfo implements UserInfo {
 
  @Override
  public String getPassphrase() {
    // TODO Auto-generated method stub
    System.out.println("MyUserInfo.getPassphrase()");
    return null;
  }
 
  @Override
  public String getPassword() {
    // TODO Auto-generated method stub
    System.out.println("MyUserInfo.getPassword()");
    return null;
  }
 
  @Override
  public boolean promptPassphrase(String arg0) {
    // TODO Auto-generated method stub
    System.out.println("MyUserInfo.promptPassphrase()");
    System.out.println(arg0);
    return false;
  }
 
  @Override
  public boolean promptPassword(String arg0) {
    // TODO Auto-generated method stub
    System.out.println("MyUserInfo.promptPassword()"); 
    System.out.println(arg0);
    return false;
  }
 
  @Override
  public boolean promptYesNo(String arg0) {
    // TODO Auto-generated method stub&#39;
     System.out.println("MyUserInfo.promptYesNo()"); 
     System.out.println(arg0); 
     if (arg0.contains("The authenticity of host")) { 
       return true; 
     } 
    return true;
  }
 
  @Override
  public void showMessage(String arg0) {
    // TODO Auto-generated method stub
    System.out.println("MyUserInfo.showMessage()"); 
  }
 
}


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn