java 执行远程shell命令,java远程调用shell

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: