이 글에서는 JSch를 사용하여 원격으로 Shell 명령을 실행하는 방법을 자세히 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
JSch는 Java Secure Channel의 약어입니다. JSch는 SSH2의 순수 Java 구현입니다. 이를 통해 SSH 서버에 연결하고 포트 전달, X11 전달, 파일 전송 등을 사용할 수 있습니다. 물론 해당 기능을 자신의 애플리케이션에 통합할 수도 있습니다. 프레임워크 jsch는 2016년에 업데이트되었으며 현재는 더 이상 업데이트되지 않는 매우 오래된 프레임워크입니다.
ChannelExec: 한 번에 하나의 명령을 실행합니다.
ChannelShell: 여러 명령을 실행할 수 있으므로 일상적인 개발에서는 많이 사용되지 않으므로 필요에 따라 사용할 수 있습니다.
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令) ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流
;을 사용하여 각 명령을 구분합니다. 참고: 각 명령의 실행은 다른 명령의 실행에 영향을 주지 않습니다. 즉, 각 명령이 실행되지만 모든 명령이 성공적으로 실행된다는 보장은 없습니다.
각 명령을 &&로 구분하세요. 참고: 이전 명령이 성공적으로 실행되면 다음 명령이 실행됩니다. 이렇게 하면 모든 명령이 실행된 후 실행 프로세스가 성공합니다.
각 명령은 ||로 구분하세요. 참고: ||는 또는 명령이 성공적으로 실행될 때까지 이전 명령 실행이 실패한 후에만 다음 명령이 실행된다는 것을 의미합니다.
ChannelShell의 경우 여러 명령을 입력 스트림 형태로 실행할 수 있습니다. 이는 로컬 컴퓨터에서 대화형 셸을 사용하는 것과 같습니다(일반적으로 대화형 사용에 사용됩니다). 중지하려면 두 가지 방법이 있습니다.
종료 명령을 보내 프로그램에 이 상호 작용이 끝났음을 알립니다.
바이트 스트림에서 사용 가능한 방법을 사용하여 데이터의 전체 크기를 가져옵니다. 그런 다음 루프 읽기를 반복하십시오.
<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(); }}
위 도구 사용:
package org.example;import org.example.shell.Shell;/** * Hello world! * */public class App { public static void main( String[] args ) { String cmd = "ls -1"; Shell shell = new Shell("192.168.10.10", "ubuntu", "11111"); String execLog = shell.execCommand(cmd); System.out.println(execLog); }}
권장: "java 비디오 튜토리얼"
위 내용은 JSch가 쉘 명령을 원격으로 실행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!