Dieser Artikel gibt Ihnen eine detaillierte Einführung in die Remoteausführung von Shell-Befehlen mit JSch. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
JSch ist die Abkürzung für Java Secure Channel. JSch ist eine reine Java-Implementierung von SSH2. Sie können damit eine Verbindung zu einem SSH-Server herstellen und Portweiterleitung, X11-Weiterleitung, Dateiübertragung usw. nutzen. Natürlich können Sie die Funktionalität auch in Ihre eigenen Anwendungen integrieren. Das Framework jsch ist ein sehr altes Framework. Es wurde 2016 aktualisiert und wird jetzt nicht mehr aktualisiert.
ChannelExec: Im Allgemeinen reicht dies für uns aus.
ChannelShell: Es wird in der täglichen Entwicklung nicht oft verwendet, daher können Sie es nach Bedarf verwenden.
Trennen Sie jeden Befehl durch &&. Hinweis: Wenn der vorherige Befehl erfolgreich ausgeführt wurde, wird der folgende Befehl ausgeführt. Dadurch wird sichergestellt, dass der Ausführungsprozess erfolgreich ist, nachdem alle Befehle ausgeführt wurden.
Trennen Sie jeden Befehl durch ||. Hinweis: || bedeutet, dass der nächste Befehl erst dann ausgeführt wird, wenn die Ausführung des vorherigen Befehls fehlschlägt, bis ein Befehl erfolgreich ausgeführt wird.
2. ChannelShell
Senden Sie einen Exit-Befehl, um dem Programm mitzuteilen, dass diese Interaktion beendet ist.
Verwenden Sie die verfügbare Methode im Byte-Stream, um die Gesamtgröße der Daten zu ermitteln. und dann Schleife lesen.
Verwendungsbeispiel
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令) ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>
package org.example.shell;/** * Created by qianghaohao on 2021/3/28 */import com.jcraft.jsch.ChannelExec;import com.jcraft.jsch.JSch;import com.jcraft.jsch.Session;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;/** * @description: * @author: qianghaohao * @time: 2021/3/28 */public class Shell { private String host; private String username; private String password; private int port = 22; private int timeout = 60 * 60 * 1000; public Shell(String host, String username, String password, int port, int timeout) { this.host = host; this.username = username; this.password = password; this.port = port; this.timeout = timeout; } public Shell(String host, String username, String password) { this.host = host; this.username = username; this.password = password; } public String execCommand(String cmd) { JSch jSch = new JSch(); Session session = null; ChannelExec channelExec = null; BufferedReader inputStreamReader = null; BufferedReader errInputStreamReader = null; StringBuilder runLog = new StringBuilder(""); StringBuilder errLog = new StringBuilder(""); try { // 1. 获取 ssh session session = jSch.getSession(username, host, port); session.setPassword(password); session.setTimeout(timeout); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 获取到 ssh session // 2. 通过 exec 方式执行 shell 命令 channelExec = (ChannelExec) session.openChannel("exec"); channelExec.setCommand(cmd); channelExec.connect(); // 执行命令 // 3. 获取标准输入流 inputStreamReader = new BufferedReader(new InputStreamReader(channelExec.getInputStream())); // 4. 获取标准错误输入流 errInputStreamReader = new BufferedReader(new InputStreamReader(channelExec.getErrStream())); // 5. 记录命令执行 log String line = null; while ((line = inputStreamReader.readLine()) != null) { runLog.append(line).append("\n"); } // 6. 记录命令执行错误 log String errLine = null; while ((errLine = errInputStreamReader.readLine()) != null) { errLog.append(errLine).append("\n"); } // 7. 输出 shell 命令执行日志 System.out.println("exitStatus=" + channelExec.getExitStatus() + ", openChannel.isClosed=" + channelExec.isClosed()); System.out.println("命令执行完成,执行日志如下:"); System.out.println(runLog.toString()); System.out.println("命令执行完成,执行错误日志如下:"); System.out.println(errLog.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (inputStreamReader != null) { inputStreamReader.close(); } if (errInputStreamReader != null) { errInputStreamReader.close(); } if (channelExec != null) { channelExec.disconnect(); } if (session != null) { session.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return runLog.toString(); }}
“
Das obige ist der detaillierte Inhalt vonWie JSch Shell-Befehle remote ausführt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!