用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执行交互式命令相关推荐

  1. redis 启动无输出_Git Bash 中执行交互式命令无响应

    众所周知的原因,Windows下的命令行工具CMD非常难用,所以大家一般用Git Bash作为替代品,但是有时候在其中执行一些命令会出现无响应(无输出结果.无报错信息)的现象,本文将给出该现象的原因及 ...

  2. JSch执行shell命令

    JSch执行shell命令 参考:jsch中ChannelShell与ChannelExec区别 参考:jsch中ChannelShell与ChannelExec区别 package com.bob. ...

  3. 在Matlab命令窗口中执行,交互式命令操作就是在MATLAB命令行窗口中输入命令并执行。...

    交互式命令操作就是在MATLAB命令行窗口中输入命令并执行. 答:√ 中国大学MOOC: 一侧肾切除后,另一留存肾会长得更加硕大,这种生理现象称为 . 答:代偿 Street jazz 的编舞师都会有 ...

  4. JSch连接不上Linux服务器,windows 下 java程序jsch连接远程linux服务器执行shell命令

    java远程连接服务的shell需要使用SSH的登录方式,可以使用JSch技术.JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等. ...

  5. 交互式脚本遍历ip和密码登录到主机执行任何命令通用版、执行交互式脚本报错root@xxx‘s password: missing close-bracket处理方法

    说明 我们有三四五期的物理机,每次做变动都是几百台底层物理机同步操作,其实我放了蛮多脚本,其中很多都是复用的,但后面改来改去,发现自己有点懵逼了,有点看不懂这些脚本了.... 而且每次之前用过的再用的 ...

  6. java连接linux服务器执行shell命令(框架分析+推荐)

    java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...

  7. 02_clickhouse安装,卸载,启动/关闭服务,交互式命令(数据库创建,数据导入,查询),批模式数据导入,MySQL接口操作ClickHouse,DBeaver可视化工具安装与使用(学习笔记)

    1 ClickHouse安装 安装文件清单 clickhouse-client-${version}.noarch.rpm clickhouse-common-static-dbg-${version ...

  8. hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HDFS权限配置,C++客户端编程,常见错误

    本篇博文为整理网络上Hadoop-HA搭建后出来的博客,参考网址为:http://blog.chinaunix.net/uid-196700-id-5751309.html 3. 部署 3.1. 机器 ...

  9. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

最新文章

  1. Linux 下安装 Android Studio
  2. MySQL 的备份和恢复机制 MyISAM 和 Innodb
  3. 综述:基于GAN的图像翻译模型盘点
  4. TestNG 使 Java 单元测试轻而易举
  5. 一个有趣的Go项目,3D界面管理k8s集群,真好玩!
  6. 多面体 (Multipatch)
  7. ue默认高亮mysql_UE设置打开文件的默认高亮语言
  8. “新基建”提速,工业互联网大数据发展迎新机遇
  9. Rabbit and Grass【博弈】
  10. msmtp在RHEL6.5下的安装
  11. OPPO Find X继任者来了!Find Z曝光:搭载骁龙855
  12. JavaWeb——AOP
  13. 蓝桥杯2021年第十二届C++省赛第三题-直线
  14. php中好看的对话框面板,有关对话框的课程推荐10篇
  15. linux - CRT -- SSH链接 - sftp - cron定时任务、
  16. mac安装pillow
  17. 习题 6.13 编一程序,将两个字符串连接起来,不要用strcat函数。
  18. CSS消除absolute 的影响
  19. .Net Core Mvc 2.1如何调用thrift
  20. Radare2 框架介绍及使用

热门文章

  1. VsCode 安装配置 Rust
  2. SecureCRT 7序列号
  3. 【操作系统】实验楼实验2-操作系统的启动
  4. 【SpringBoot】42、SpringBoot中自定义Favicon
  5. Windows 优化专家
  6. Web数据挖掘在电子商务中的应用
  7. border-bottom 自定义长度
  8. 我的2012----苦逼程序员的蜕变
  9. 为什么要使用微软的 Application Framework?
  10. 英文名字来源及涵意!