Heim >Java >javaLernprogramm >Detaillierte Einführung in Java, das über SSH eine Verbindung zum Server herstellt, um Shell-Befehle und Beispielcode auszuführen
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' 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!