基于Java实现ssh命令登录主机执行shell命令过程解析

 更新时间:2019年12月18日 15:22:16   作者:龙凌云端  
这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、SSH命令

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UXLinuxAIXSolarisDigital UNIXIrix,以及其他平台,都可运行SSH。

实际工作中,我们经常使用客户端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主机上,执行一些操作命令。

如何使用Java语言实现SSH 连接主机,并执行Shell命令呢?

2、Java 实现 SSH命令

1)代码实现如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Calendar;

import org.apache.commons.lang3.StringUtils;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;


public class SshUtil {
 private static String DEFAULT_CHAR_SET = "UTF-8";
 private static String tipStr = "=======================%s=======================";
 private static String splitStr = "=====================================================";
 
 /**
  * 登录主机
  * @return
  *  登录成功返回true,否则返回false
  */
 public static Connection login(String ip, String userName, String password){
  boolean isAuthenticated = false;
  Connection conn = null;
  long startTime = Calendar.getInstance().getTimeInMillis();
  try {
   conn = new Connection(ip);
   conn.connect(); // 连接主机

   isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证
   if(isAuthenticated){
    System.out.println(String.format(tipStr, "认证成功"));
   } else {
    System.out.println(String.format(tipStr, "认证失败"));
   }
  } catch (IOException e) {
   System.err.println(String.format(tipStr, "登录失败"));
   e.printStackTrace();
  }
  long endTime = Calendar.getInstance().getTimeInMillis();
  System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr);
  return conn;
 }
 
 /**
  * 远程执行shell脚本或者命令
  * @param cmd
  *  即将执行的命令
  * @return
  *  命令执行完后返回的结果值
  */
 public static String execute(Connection conn, String cmd){
  String result = "";
  Session session = null;
  try {
   if(conn != null){
    session = conn.openSession(); // 打开一个会话
    session.execCommand(cmd);  // 执行命令
    result = processStdout(session.getStdout(), DEFAULT_CHAR_SET);

    //如果为得到标准输出为空,说明脚本执行出错了
    if(StringUtils.isBlank(result)){
     System.err.println("【得到标准输出为空】\n执行的命令如下:\n" + cmd);
     result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);
    }else{
     System.out.println("【执行命令成功】\n执行的命令如下:\n" + cmd);
    }
   }
  } catch (IOException e) {
   System.err.println("【执行命令失败】\n执行的命令如下:\n" + cmd + "\n" + e.getMessage());
   e.printStackTrace();
  } finally {
   if (conn != null) {
    conn.close();
   }
   if (session != null) {
    session.close();
   }
  }
  return result;
 }

 /**
  * 解析脚本执行返回的结果集
  * @param in 输入流对象
  * @param charset 编码
  * @return
  *  以纯文本的格式返回
  */
 private static String processStdout(InputStream in, String charset){
  InputStream stdout = new StreamGobbler(in);
  StringBuffer buffer = new StringBuffer();
  try {
   BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
   String line = null;
   while((line = br.readLine()) != null){
    buffer.append(line + "\n");
   }
  } catch (UnsupportedEncodingException e) {
   System.err.println("解析脚本出错:" + e.getMessage());
   e.printStackTrace();
  } catch (IOException e) {
   System.err.println("解析脚本出错:" + e.getMessage());
   e.printStackTrace();
  }
  return buffer.toString();
 }

 public static void main(String[] args){
  String ip = "192.168.123.234"; // 此处根据实际情况,换成自己需要访问的主机IP
  String userName = "root";
  String password = "password";
  Connection conn = SshUtil.login(ip, userName, password);

  String cmd = "cd /home/miracle&&pwd&&ls&&cat luna.txt";
  String result = SshUtil.execute(conn, cmd);
  System.out.println(splitStr + "\n执行的结果如下: \n" + result + splitStr);
 }
}

2)运行结果如下:

=======================认证成功=======================
登录用时: 0.859s
=====================================================
【执行命令成功】
执行的命令如下:
cd /home/miracle&&pwd&&ls&&cat luna.txt
=====================================================
执行的结果如下: 
/home/miracle
luna.txt
Hello, I'm SshUtil.
Nice to meet you.^_^
=====================================================

3)pom.xml 引用添加如下:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.9</version>
  </dependency>

  <!-- ssh -->
  <dependency>
   <groupId>ch.ethz.ganymed</groupId>
   <artifactId>ganymed-ssh2</artifactId>
   <version>262</version>
  </dependency>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot打印POST请求原始入参body体方式

    SpringBoot打印POST请求原始入参body体方式

    这篇文章主要介绍了SpringBoot打印POST请求原始入参body体方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • IntelliJ IDEA 报错:找不到包或者找不到符号的问题及解决方案

    IntelliJ IDEA 报错:找不到包或者找不到符号的问题及解决方案

    这篇文章主要介绍了IntelliJ IDEA 报错:找不到包或者找不到符号的问题及解决方案,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • vscode 配置java环境并调试运行的详细过程

    vscode 配置java环境并调试运行的详细过程

    这篇文章主要介绍了vscode 配置java环境并调试运行的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 关于SpringMVC的异常处理机制详细解读

    关于SpringMVC的异常处理机制详细解读

    这篇文章主要介绍了关于SpringMVC的异常处理机制详细解读,SpringMVC是目前主流的Web MVC框架之一,本文将分析SpringMVC的异常处理内容,需要的朋友可以参考下
    2023-05-05
  • SpringBoot启动过程逐步分析讲解

    SpringBoot启动过程逐步分析讲解

    这篇文章主要介绍了SpringBoot启动过程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • Java OOM原因以及解决方案

    Java OOM原因以及解决方案

    这篇文章主要介绍了Java OOM原因以及解决方案,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • java 数据结构基本算法希尔排序

    java 数据结构基本算法希尔排序

    这篇文章主要介绍了数据结构基本算法希尔排序的相关资料,需要的朋友可以参考下
    2017-08-08
  • 关于ThreadLocal和InheritableThreadLocal解析

    关于ThreadLocal和InheritableThreadLocal解析

    这篇文章主要介绍了关于ThreadLocal和InheritableThreadLocal解析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • spring后置通知@AfterReturning的使用

    spring后置通知@AfterReturning的使用

    这篇文章主要介绍了spring后置通知@AfterReturning的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 浅谈缓冲字符流 BufferedReader BufferedWriter用法

    浅谈缓冲字符流 BufferedReader BufferedWriter用法

    这篇文章主要介绍了缓冲字符流 BufferedReader BufferedWriter的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论