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

相关文章

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py