当前位置 主页 > 服务器问题 > win服务器问题汇总 >

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

    栏目:win服务器问题汇总 时间:2019-12-18 21:40

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

    1、SSH命令

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