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

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni