java 执行远程shell命令,java远程调用shell
00-1010背景JSch介绍使用示例参考文件时的注意事项
00-1010项目需求,要求远程ssh登录到节点以执行shell命令来完成任务。对于这种需求,如果不使用java程序,linux的ssh命令可以直接完成,但是编码进程序时,需要相关的包来完成。本文主要介绍如何使用JSch包实现ssh远程连接,并在java中执行命令。
00-1010JSCH是Java安全通道的缩写。JSch是SSH2的纯Java实现。它允许您连接到SSH服务器,并可以使用端口转发、X11转发、文件传输等。当然,您也可以将其功能集成到您自己的应用程序中。Jsch是一个很老的框架,更新到2016年,现在也不更新了。
JSch使用shell来执行命令。有两种方法
ChannelExec:一次执行一个命令。一般来说,这对我们来说已经足够了。ChannelShell:可以执行多个命令,但很少用于开发。请根据你的需要来。channel exec channel exec=(channel exec)session . open channel( exec );//只能执行一条指令(或者可以执行一条符合的指令);channel shell channel shell=(channel shell)session . open channel(“shell”);//可以执行多条指令,但是iostream 1。ChannelExec是必需的。
在每个命令之间使用;分开。注意:每个命令的执行都是成功的,不会影响其他命令的执行。换句话说,每个命令都会被执行,但不能保证每个命令都会被成功执行。每个命令由一个分隔。注意:如果前一个命令成功执行,将执行下面的命令。这可以确保所有命令都成功执行。每个命令都用分隔。注意:表示“或”,只有在前一条命令失败后才会执行下一条命令,直到一条命令执行成功。
2.通道外壳
对于ChannelShell来说,以输入流的形式,可以执行多条指令,就像在本地计算机上使用交互Shell一样(通常用于:交互使用)。如果你想停下来,有两种方法:
发送退出命令,告诉程序本次交互结束;使用字节流中可用的方法获取数据的总大小,然后在循环中读取它。
00-1010 1.介绍pom依赖性
依赖性groupIdcom.jcraft/groupId ArtifactidJSCH/ArtifactidVersion 0 . 1 . 53/version/dependency 2 . jsch用法示例
这里封装了一个shell工具类,用于执行Shell命令。具体使用细节在代码注释中有描述,可以直接复制使用。代码如下:
包org . example . shell;/***由强浩浩于2021/3/28 */import com . j craft . jsch . channel exec创建;导入com . j craft . jsch . jsch;导入com . j craft . jsch . session;导入Java . io . buffered reader;导入Java . io . io exception;导入Java . io . inputstreamreader;/* * * * @ description : * @ author : qianghaohao * @ time : 2021/3/28 */public class Shell { private String host;私有字符串用户名;私有字符串密码;private int port=22private int timeout=60 * 60 * 1000public Shell(字符串主机,字符串用户名,字符串密码,int端口,int超时){ this.host=hostthis.username=用户名;this.password=密码;this.port=portthis . time out=time out;}公共Shell(字符串主机,st
ring 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); }}
需要注意的点
如果需要后台执行某个命令,不能直接 <命令> + & 的方式执行,这样在 JSch 中不生效,需要写成这样的格式:<命令> > /dev/null 2>&1 &。比如要后台执行 sleep 60,需要写成 sleep 60 > /dev/null 2>&1
具体 issue 见这里:https://stackoverflow.com/questions/37833683/running-programs-using-jsch-in-the-background
参考文档
https://www.cnblogs.com/slankka/p/11988477.html
https://blog.csdn.net/sinat_24928447/article/details/83022818
到此这篇关于Java JSch远程执行Shell命令的方法的文章就介绍到这了,更多相关Java JSch远程执行Shell命令内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。