zoukankan      html  css  js  c++  java
  • 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
    " + 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("【得到标准输出为空】
    执行的命令如下:
    " + cmd);
                        result = processStdout(session.getStderr(), DEFAULT_CHAR_SET);
                    }else{
                        System.out.println("【执行命令成功】
    执行的命令如下:
    " + cmd);
                    }
                }
            } catch (IOException e) {
                System.err.println("【执行命令失败】
    执行的命令如下:
    " + cmd + "
    " + 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 + "
    ");
                }
            } 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 + "
    执行的结果如下: 
    " + 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>

    PS:

    关于Maven依赖的 jar包 下载问题,请参考如下博文:

    https://www.cnblogs.com/miracle-luna/p/11863679.html

    Java 实现 bash命令
    https://www.cnblogs.com/miracle-luna/p/12050728.html

    Java 实现 ssh命令 登录主机执行shell命令
    https://www.cnblogs.com/miracle-luna/p/12050367.html

    Java 实现 telnet命令 验证主机端口的连通性
    https://www.cnblogs.com/miracle-luna/p/12049658.html

    Java 检查IPv6地址的合法性
    https://www.cnblogs.com/miracle-luna/p/12041780.html

    Java 实现判断 主机是否能 ping 通
    https://www.cnblogs.com/miracle-luna/p/12026797.html

  • 相关阅读:
    LeetCode20 有效的括号
    函数的多个参数
    定义一个函数的基本语法 函数的参数
    函数
    金字塔
    水仙花数
    百鸡百钱
    循环demo
    while适用于不确定循环次数
    浏览器打断点
  • 原文地址:https://www.cnblogs.com/miracle-luna/p/12050367.html
Copyright © 2011-2022 走看看