JSch中执行command的两种方式

2023-12-20 12:48

本文主要是介绍JSch中执行command的两种方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

准备目标登录主机信息:

public class DestHost {private String host = "";private String username = "";private String password = "";private int port = 22;private int timeout = 60 * 60 * 1000;public DestHost(String host, String username, String password){this(host, username, password, 22, 60*60*1000);}public DestHost(String host, String username, String password, int timeout){this(host, username, password, 22, timeout);}public DestHost(String host, String username, String password, int port,int timeout) {super();this.host = host;this.username = username;this.password = password;this.port = port;this.timeout = timeout;}...
}

SSH工具类:

1.JSch 使用shell执行命令,有两种方法:

ChannelExec channelExec = (ChannelExec) session.openChannel("exec");//只能执行一条指令(也可执行符合指令)

    一次性执行多条shell的方法:

        1)每个命令之间用;隔开
            说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。

        2)每个命令之间用&&隔开
            说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。

        3)每个命令之间用||隔开
            说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。

ChannelShell channelShell = (ChannelShell) session.openChannel("shell");//可执行多条指令 不过需要输入输出流

public class SSHUtils {private static final String ENCODING = "UTF-8";public static Session getJSchSession(DestHost destHost) throws JSchException {JSch jsch = new JSch();Session session = jsch.getSession(destHost.getUsername(), destHost.getHost(), destHost.getPort());session.setPassword(destHost.getPassword());session.setConfig("StrictHostKeyChecking", "no");//第一次访问服务器不用输入yessession.setTimeout(destHost.getTimeout());session.connect();return session;}public static String execCommandByJSch(Session session, String command, String  resultEncoding) throws IOException,JSchException{//1.默认方式,执行单句命令		ChannelExec channelExec = (ChannelExec) session.openChannel("exec");InputStream in = channelExec.getInputStream();channelExec.setCommand(command);channelExec.setErrStream(System.err);channelExec.connect();String result = IOUtils.toString(in, resultEncoding);channelExec.disconnect();return result;}

下面就是使用“shell”方式进行的调用:

public static String execCommandByShell(Session session)throws IOException,JSchException{String result = "";//2.尝试解决 远程ssh只能执行一句命令的情况ChannelShell channelShell = (ChannelShell) session.openChannel("shell");InputStream inputStream = channelShell.getInputStream();//从远端到达的数据  都能从这个流读取到channelShell.setPty(true);channelShell.connect();OutputStream outputStream = channelShell.getOutputStream();//写入该流的数据  都将发送到远程端//使用PrintWriter 就是为了使用println 这个方法//好处就是不需要每次手动给字符加\nPrintWriter printWriter = new PrintWriter(outputStream);printWriter.println("cd /opt/applog/MSISVCServer");printWriter.println("ls");printWriter.println("exit");//为了结束本次交互printWriter.flush();//把缓冲区的数据强行输出/**
shell管道本身就是交互模式的。要想停止,有两种方式: 
一、人为的发送一个exit命令,告诉程序本次交互结束
二、使用字节流中的available方法,来获取数据的总大小,然后循环去读。
为了避免阻塞
*/byte[] tmp = new byte[1024];while(true){while(inputStream.available() > 0){int i = inputStream.read(tmp, 0, 1024);if(i < 0) break;String s = new String(tmp, 0, i);if(s.indexOf("--More--") >= 0){outputStream.write((" ").getBytes());outputStream.flush();}System.out.println(s);}if(channelShell.isClosed()){System.out.println("exit-status:"+channelShell.getExitStatus());break;}try{Thread.sleep(1000);}catch(Exception e){}}outputStream.close();inputStream.close();channelShell.disconnect();session.disconnect();System.out.println("DONE");return result;}

 

这篇关于JSch中执行command的两种方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/516107

相关文章

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte