Heim  >  Artikel  >  Java  >  Detaillierte Einführung in Java, das über SSH eine Verbindung zum Server herstellt, um Shell-Befehle und Beispielcode auszuführen

Detaillierte Einführung in Java, das über SSH eine Verbindung zum Server herstellt, um Shell-Befehle und Beispielcode auszuführen

黄舟
黄舟Original
2017-03-08 10:33:421730Durchsuche

In diesem Artikel werden hauptsächlich ausführliche Erläuterungen und Beispielmethoden für die Verbindung von Java mit dem Server über SSH zur Ausführung von Shell-Befehlen vorgestellt.

Java-Verbindung zum Server über SSH zur Ausführung von Shell-Befehlen im Detail

Java stellt über SSH eine Verbindung zum Server her, um Shell-Befehle auszuführen: JSch ist eine reine Java-Implementierung von SSH2. Es ermöglicht Ihnen, eine Verbindung zu einem SSD-Server herzustellen, Portweiterleitung, X11-Weiterleitung, Dateiübertragungen und mehr zu verwenden. Sie können die Funktionalität in Ihre eigenen Programme integrieren. Gleichzeitig stellt das Projekt auch eine J2ME-Version für die direkte Verbindung zum SSHD-Server auf dem Mobiltelefon bereit.

SSH ist die Abkürzung für Secure Shell, ein Sicherheitsprotokoll, das auf der Anwendungsschicht und der Transportschicht basiert. SSH verschlüsselt alle Daten während des Verbindungs- und Übertragungsprozesses und kann zum Aufbau sicherer Verbindungen zwischen verschiedenen Systemen oder Servern verwendet werden. SSH bietet zwei Sicherheitsauthentifizierungsmethoden: passwortbasierte Authentifizierung und schlüsselbasierte Authentifizierung. Unter anderem ist die passwortbasierte Authentifizierung relativ einfach. Solange Sie den Benutzernamen und das Passwort des Remote-Hosts kennen, können Sie sich anmelden. Die schlüsselbasierte Authentifizierung ist problematischer und die Verbindung zeitaufwändiger, daher werden wir sie hier nicht im Detail vorstellen.

Es gibt viele Clients, die auf dem SSH-Protokoll basieren, wie zum Beispiel: PuTTY, OpenSSH, Xshell 4 usw., die eine Remote-Verbindung zu fast allen UNIX-Plattformen herstellen können. Gleichzeitig können Sie über die Linux-Befehlszeile ssh uername@host eine Verbindung zu einem Host herstellen.

Wie kann man im Projekt Code verwenden, um SSH zu implementieren und Shell-Skripte remote auszuführen? JSch ist die Abkürzung für Java Secure Channel. Es handelt sich um eine reine Java-Implementierung der SSH2-Funktion. Weitere Informationen finden Sie auf der offiziellen Website von JSch. Es ermöglicht Ihnen, eine Verbindung zu einem SSH-Server herzustellen und Portweiterleitung, X11-Weiterleitung, Dateiübertragung usw. zu nutzen, und Sie können seine Funktionalität auch in Ihre eigenen Anwendungen integrieren. Vor der Verwendung müssen Sie das JSch-Paket herunterladen und importieren: jsch-0.1.50.jar.

Beispielprogramm

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


Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Java, das über SSH eine Verbindung zum Server herstellt, um Shell-Befehle und Beispielcode auszuführen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn