1、添加依赖

  1. <dependency>
  2. <groupId>ch.ethz.ganymed</groupId>
  3. <artifactId>ganymed-ssh2</artifactId>
  4. <version>262</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>commons-io</groupId>
  8. <artifactId>commons-io</artifactId>
  9. <version>2.6</version>
  10. </dependency>

2、Api说明

  1. 首先构造一个连接器,传入一个需要登陆的ip地址;
  1. Connection conn = new Connection(ipAddr);
  1. 模拟登陆目的服务器,传入用户名和密码;
  1. boolean isAuthenticated = conn.authenticateWithPassword(userName, passWord);

它会返回一个布尔值,true 代表成功登陆目的服务器,否则登陆失败。

  1. 打开一个session,执行你需要的linux 脚本命令;
  1. Session session = conn.openSession();
  2. session.execCommand(“ifconfig”);
  1. 接收目标服务器上的控制台返回结果,读取br中的内容;
  1. InputStream stdout = new StreamGobbler(session.getStdout());
  2. BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
  1. 得到脚本运行成功与否的标志 :0-成功 非0-失败
  1. System.out.println(“ExitCode: + session.getExitStatus());
  1. 关闭session和connection
  1. session.close();
  2. conn.close();

Tips:

  1. 通过第二部认证成功后当前目录就位于/home/username/目录之下,你可以指定脚本文件所在的绝对路径,或者通过cd导航到脚本文件所在的目录,然后传递执行脚本所需要的参数,完成脚本调用执行。
  2. 执行脚本以后,可以获取脚本执行的结果文本,需要对这些文本进行正确编码后返回给客户端,避免乱码产生。
  3. 如果你需要执行多个linux控制台脚本,比如第一个脚本的返回结果是第二个脚本的入参,你必须打开多个Session,也就是多次调用

    Session sess = conn.openSession();,使用完毕记得关闭就可以了。

3. 实例:工具类

  1. public class SSHTool {
  2. private Connection conn;
  3. private String ipAddr;
  4. private Charset charset = StandardCharsets.UTF_8;
  5. private String userName;
  6. private String password;
  7. public SSHTool(String ipAddr, String userName, String password, Charset charset) {
  8. this.ipAddr = ipAddr;
  9. this.userName = userName;
  10. this.password = password;
  11. if (charset != null) {
  12. this.charset = charset;
  13. }
  14. }
  15. /**
  16. * 登录远程Linux主机
  17. *
  18. * @return 是否登录成功
  19. */
  20. private boolean login() {
  21. conn = new Connection(ipAddr);
  22. try {
  23. // 连接
  24. conn.connect();
  25. // 认证
  26. return conn.authenticateWithPassword(userName, password);
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. return false;
  30. }
  31. }
  32. /**
  33. * 执行Shell脚本或命令
  34. *
  35. * @param cmds 命令行序列
  36. * @return 脚本输出结果
  37. */
  38. public StringBuilder exec(String cmds) throws IOException {
  39. InputStream in = null;
  40. StringBuilder result = new StringBuilder();
  41. try {
  42. if (this.login()) {
  43. // 打开一个会话
  44. Session session = conn.openSession();
  45. session.execCommand(cmds);
  46. in = session.getStdout();
  47. result = this.processStdout(in, this.charset);
  48. conn.close();
  49. }
  50. } finally {
  51. if (null != in) {
  52. in.close();
  53. }
  54. }
  55. return result;
  56. }
  57. /**
  58. * 解析流获取字符串信息
  59. *
  60. * @param in 输入流对象
  61. * @param charset 字符集
  62. * @return 脚本输出结果
  63. */
  64. public StringBuilder processStdout(InputStream in, Charset charset) throws FileNotFoundException {
  65. byte[] buf = new byte[1024];
  66. StringBuilder sb = new StringBuilder();
  67. // OutputStream os = new FileOutputStream("./data.txt");
  68. try {
  69. int length;
  70. while ((length = in.read(buf)) != -1) {
  71. // os.write(buf, 0, c);
  72. sb.append(new String(buf, 0, length));
  73. }
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. return sb;
  78. }
  79. public static void main(String[] args) throws IOException {
  80. SSHTool tool = new SSHTool("192.168.100.40", "root", "123456", StandardCharsets.UTF_8);
  81. StringBuilder exec = tool.exec("bash /root/test12345.sh");
  82. System.out.println(exec);
  83. }
  84. }

4、测试脚本

  1. echo "Hello"

输出结果

Java实践-远程调用Shell脚本并获取输出信息的更多相关文章

  1. Shell 脚本 —— java 代码远程调用shell脚本重启 tomcat

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.创建maven 工程 ​ maven 依赖: <dependency> <grou ...

  2. Java SSH远程执行Shell脚本实现(转)

    前言 此程序需要ganymed-ssh2-build210.jar包(下载地址:http://www.ganymed.ethz.ch/ssh2/) 为了调试方便,可以将\ganymed-ssh2-bu ...

  3. 远程调用shell脚本文件和远程复制文件

    1.安装sshpass yum install sshpass 2.本地调用远程服务器的shell脚本文件: sshpass -p sa ssh root@192.168.56.105 -C &quo ...

  4. Java实践 — SSH远程执行Shell脚本(转)

    原文地址:http://www.open-open.com/lib/view/open1384351384024.html 1. SSH简介         SSH是Secure Shell的缩写,一 ...

  5. Java实践 — SSH远程执行Shell脚本

    1. SSH简介         SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接 ...

  6. 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码传参数 ...

  7. JAVA远程执行Shell脚本类

    1.java远程执行shell脚本类 package com.test.common.utility; import java.io.IOException; import java.io.Input ...

  8. Java 调用 shell 脚本详解

    这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的“陷阱”造成调用shell 脚本在某些特 ...

  9. [转载]JAVA调用Shell脚本

    FROM:http://blog.csdn.net/jj12345jj198999/article/details/11891701 在实际项目中,JAVA有时候需要调用C写出来的东西,除了JNI以外 ...

随机推荐

  1. IntelliJ IDEA的常用设置

    1.设置IDEA主题样式 ①设置方法: ②效果:设置为Darcula之后整体的风格就是暗黑主题,如上图. 2.设置编辑区主题 ①设置方法: 注:由于IDEA自带的编辑区主题比较少,想要更多的编辑区主题 ...

  2. Jmeter的中英文互换

    1.jmeter的中英文互换:为了更深入的了解Jmeter,一般使用英文版的jmeter. 旧版本下载的默认中文较多.新版本5.1的下载后默认英文比较的多. 方法一: 选项->选择一种语言,但是 ...

  3. Proteus报错处理经验:power rails ‘GND’ and 'VCC/VDD' are interconnected in net VCC

    1 前言 初学Proteus,画好原理图后遇到了power rails 'GND' and 'VCC/VDD' are interconnected in net VCC的报错. 尝试了网上的解决办法 ...

  4. leveldb memtable

    memtable常驻于内存,需要按照key进行排序,通常意义上的话,可以使用二叉查找树来实现,跟进一步可以使用红黑树保证树的平衡,但是leveldb中使用了另外的一种数据结构:跳表Skip List. ...

  5. mysql查询字段类型为json时的两种查询方式。

    表结构如下: id        varchar(32) info     json 数据: id = info = {"age": "18","di ...

  6. 利用Redisson实现分布式锁及其底层原理解析

    Redis介绍 参考地址:https://blog.csdn.net/turbo_zone/article/details/83422215 redis是一个key-value存储系统.和Memcac ...

  7. AtCoder Beginner Contest 133 B - Good Distance

    地址:https://atcoder.jp/contests/abc133/tasks/abc133_b 核心问题:判断一个浮点数开方是否为整数 ; double ans1=sqrt(ans); if ...

  8. python的继承、重载和重写???

    继承语法:<1>单继承:class(父类名)<2>多继承class(父类1,父类2,父类n...) 继承的特点:<1>减少代码量和灵活指定型类<2>子类 ...

  9. hadoop编程小技巧(1)---map端聚合

    測试hadoop版本号:2.4  Map端聚合的应用场景:当我们仅仅关心全部数据中的部分数据时,而且数据能够放入内存中. 使用的优点:能够大大减小网络数据的传输量,提高效率: 一般编程思路:在Mapp ...

  10. 定制团队自己的 Vue template

    一,我们使用vue-cli 可以快速初始化vue.js的项目,官方提供了webpack,pwa,browserify-sipmple,等常用template 二.置知识1,模板结构template:该 ...