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

相关文章

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注