Jsch执行交互式命令
用Jsch写个SSH小工具,被朋友吐槽,用ansible就好了,干嘛要用java去做批量的机器控制,ansible确实不错,但是不知道该怎么进行应用集成,我的定位ansible他是一个运维工具,并不能实现我的需求,所以自己用java写个。讲个直白点的例子,你程序中做ftp上传,你会去调用ansible吗,这不可能啊。但是你可以用jsch的sftp来做,apache也是这么做的。可以参考下:commons-vfs2-2.0.jar:SftpFileProvider
package com.qimo.omsa.demo;import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Properties;
import java.util.concurrent.TimeUnit;/*** @Description TODO* @Author 姚仲杰#80998699* @Date 2021/5/15 13:02*/
public class SSH {private Session session;private ChannelShell shell;private String username = "root";private String host = "127.0.0.1";private String password = "xxxxxx";public SSH(String username, String host, String password) {this.username = username;this.host = host;this.password = password;}public Session getSession(){return this.session;}public void connect() {JSch ssh = new JSch();try {this.session = ssh.getSession(this.username, this.host);this.session.setPassword(this.password);this.session.setServerAliveCountMax(0);Properties config = new Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);this.session.connect(30000);UserInfo user = new RootUser();this.session.setUserInfo(user);System.out.println("连接成功");} catch (Exception e) {throw new RuntimeException(e);}}public int shellCmd(String... cmds) {ChannelShell channel = null;InputStream in = null;OutputStream os = null;int returnCode = -1;try {System.out.println("执行如下命令:\n" + String.join("\n", cmds));channel = (ChannelShell) session.openChannel("shell");in = channel.getInputStream();channel.setPty(true);channel.connect();os = channel.getOutputStream();for (String cmd : cmds) {os.write((cmd + "\r\n").getBytes());os.flush();TimeUnit.SECONDS.sleep(2);}os.write(("exit" + "\r\n").getBytes());os.flush();byte[] tmp = new byte[1024];while (true) {while (in.available() > 0) {int i = in.read(tmp, 0, 1024);if (i < 0) {break;}System.out.println(new String(tmp, 0, i));}if (channel.isClosed()) {if (in.available() > 0) {continue;}returnCode = channel.getExitStatus();System.out.println("exit-status: " + channel.getExitStatus());break;}try {Thread.sleep(1000);} catch (Exception ee) {}}} catch (Exception e) {throw new RuntimeException(e);} finally {try {os.close();in.close();} catch (Exception e) {e.printStackTrace();}channel.disconnect();}return returnCode;}//测试public static void main(String[] args) throws Exception {SSH ssh = new SSH("root", "10.189.0.10.", "123456");ssh.connect();String[] cmds=new String[]{"cd /home","netstat -nltp","ls"}}
}
以上代码是通过代码交互,当然你也可以通过控制台进行交互,只需要重定向channel的输入输出流即可,如下:
channel.setInputStream(System.in);
channel.setOutputStream(System.out);
Jsch执行交互式命令相关推荐
- redis 启动无输出_Git Bash 中执行交互式命令无响应
众所周知的原因,Windows下的命令行工具CMD非常难用,所以大家一般用Git Bash作为替代品,但是有时候在其中执行一些命令会出现无响应(无输出结果.无报错信息)的现象,本文将给出该现象的原因及 ...
- JSch执行shell命令
JSch执行shell命令 参考:jsch中ChannelShell与ChannelExec区别 参考:jsch中ChannelShell与ChannelExec区别 package com.bob. ...
- 在Matlab命令窗口中执行,交互式命令操作就是在MATLAB命令行窗口中输入命令并执行。...
交互式命令操作就是在MATLAB命令行窗口中输入命令并执行. 答:√ 中国大学MOOC: 一侧肾切除后,另一留存肾会长得更加硕大,这种生理现象称为 . 答:代偿 Street jazz 的编舞师都会有 ...
- JSch连接不上Linux服务器,windows 下 java程序jsch连接远程linux服务器执行shell命令
java远程连接服务的shell需要使用SSH的登录方式,可以使用JSch技术.JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等. ...
- 交互式脚本遍历ip和密码登录到主机执行任何命令通用版、执行交互式脚本报错root@xxx‘s password: missing close-bracket处理方法
说明 我们有三四五期的物理机,每次做变动都是几百台底层物理机同步操作,其实我放了蛮多脚本,其中很多都是复用的,但后面改来改去,发现自己有点懵逼了,有点看不懂这些脚本了.... 而且每次之前用过的再用的 ...
- java连接linux服务器执行shell命令(框架分析+推荐)
java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...
- 02_clickhouse安装,卸载,启动/关闭服务,交互式命令(数据库创建,数据导入,查询),批模式数据导入,MySQL接口操作ClickHouse,DBeaver可视化工具安装与使用(学习笔记)
1 ClickHouse安装 安装文件清单 clickhouse-client-${version}.noarch.rpm clickhouse-common-static-dbg-${version ...
- hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HDFS权限配置,C++客户端编程,常见错误
本篇博文为整理网络上Hadoop-HA搭建后出来的博客,参考网址为:http://blog.chinaunix.net/uid-196700-id-5751309.html 3. 部署 3.1. 机器 ...
- java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例
java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...
最新文章
- Linux 下安装 Android Studio
- MySQL 的备份和恢复机制 MyISAM 和 Innodb
- 综述:基于GAN的图像翻译模型盘点
- TestNG 使 Java 单元测试轻而易举
- 一个有趣的Go项目,3D界面管理k8s集群,真好玩!
- 多面体 (Multipatch)
- ue默认高亮mysql_UE设置打开文件的默认高亮语言
- “新基建”提速,工业互联网大数据发展迎新机遇
- Rabbit and Grass【博弈】
- msmtp在RHEL6.5下的安装
- OPPO Find X继任者来了!Find Z曝光:搭载骁龙855
- JavaWeb——AOP
- 蓝桥杯2021年第十二届C++省赛第三题-直线
- php中好看的对话框面板,有关对话框的课程推荐10篇
- linux - CRT -- SSH链接 - sftp - cron定时任务、
- mac安装pillow
- 习题 6.13 编一程序,将两个字符串连接起来,不要用strcat函数。
- CSS消除absolute 的影响
- .Net Core Mvc 2.1如何调用thrift
- Radare2 框架介绍及使用