Java如何通过ssh远程连接主机并执行命令

 更新时间:2023年07月10日 15:34:58   作者:朱又炖粉条  
这篇文章主要介绍了Java如何通过ssh远程连接主机并执行命令问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Java通过ssh远程连接主机并执行命令

需要用到的jar包:

主体代码: 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class SshLinux {
    private static final Logger log = LoggerFactory.getLogger(SshLinux.class);
    private static String  DEFAULTCHART="UTF-8";
    /**
     * 登录主机
     * @return
     *      登录成功返回true,否则返回false
     */
    public static Connection login(String ip,
                                   String userName,
                                   String userPwd){
        boolean flg=false;
        Connection conn = null;
        try {
            conn = new Connection(ip);
            conn.connect();//连接
            flg=conn.authenticateWithPassword(userName, userPwd);//认证
            if(flg){
                log.info("=========登录成功========="+conn);
                return conn;
            }
        } catch (IOException e) {
            log.error("=========登录失败========="+e.getMessage());
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 远程执行shll脚本或者命令
     * @param cmd
     *      即将执行的命令
     * @return
     *      命令执行完后返回的结果值
     */
    public static String execute(Connection conn,String cmd){
        String result="";
        try {
            if(conn !=null){
                Session session= conn.openSession();//打开一个会话
                session.execCommand(cmd);//执行命令
                result=processStdout(session.getStdout(),DEFAULTCHART);
                //如果为得到标准输出为空,说明脚本执行出错了
                if(StringUtils.isBlank(result)){
                    log.info("得到标准输出为空,链接conn:"+conn+",执行的命令:"+cmd);
                    result=processStdout(session.getStderr(),DEFAULTCHART);
                }else{
                    log.info("执行命令成功,链接conn:"+conn+",执行的命令:"+cmd);
                }
                conn.close();
                session.close();
            }
        } catch (IOException e) {
            log.info("执行命令失败,链接conn:"+conn+",执行的命令:"+cmd+"  "+e.getMessage());
            e.printStackTrace();
        }
        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) {
            log.error("解析脚本出错:"+e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            log.error("解析脚本出错:"+e.getMessage());
            e.printStackTrace();
        }
        return buffer.toString();
    }
}

注意:ganymed这个jar包,每次只能执行一条命令,如果一条命令执行了没有关闭,再去执行第二条则会throw new IOException("A remote execution has already started.");

若希望同时执行多条命令,可以在传入的cmd字符串中用&&连接多条命令。

如:

那么多条命令执行的所有结果将会一同作为返回的字符串。 

ssh 远程脚本执行 java: command not found

ssh 远程主机脚本执行、执行 java -version,报如题错误

[root@doris-fe-01 module]# ./install.sh "java -version "
java -version
doris-fe-01 ...
bash: java: command not found
doris-fe-02 ...
bash: java: command not found

### 直接登录远程主机,java -version 正常执行
[root@doris-fe-01 module]# ssh doris-fe-02
Last login: Mon Nov 14 16:54:51 2022
[root@doris-fe-02 ~]# java -version
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)

处理

export JAVA_HOME=/opt/module/jdk1.8.0_141' >>/etc/bashrc
echo 'export PATH=/opt/module/jdk1.8.0_141/bin:$PATH' >>/etc/bashrc
### 
source /etc/bashrc

[root@doris-fe-01 module]# ./install.sh "java -version "
java -version
doris-fe-01 ...
java version "1.8.0_141"
Java(TM) SE Runtime Environment (build 1.8.0_141-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.141-b15, mixed mode)
...

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Bean生命周期详细分析

    Spring Bean生命周期详细分析

    spring的核心思想之一IOC就是通过IOC容器对Bean的创建和各个bean之间的依赖关系进行操作,今天就来和大家分享一下bean的生命周期相关知识点
    2022-08-08
  • IDEA2020.1常用配置说明

    IDEA2020.1常用配置说明

    这篇文章主要介绍了IDEA2020.1常用配置说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java中HttpClient使用方法举例详解

    java中HttpClient使用方法举例详解

    这篇文章主要介绍了java中HttpClient使用方法的相关资料,HttpClient提供了发送HTTP请求和接收HTTP响应的功能,简化了HTTP通信的处理,减少了对外部库的依赖,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • SpringBoot读取properties文件配置项过程解析

    SpringBoot读取properties文件配置项过程解析

    这篇文章主要介绍了SpringBoot读取properties文件配置项过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot逻辑异常统一处理方法

    SpringBoot逻辑异常统一处理方法

    这篇文章主要介绍了SpringBoot逻辑异常统一处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Spring MVC中异常处理的三种方式

    Spring MVC中异常处理的三种方式

    这篇文章主要给大家介绍了关于Spring MVC中异常处理的三种方式,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring MVC具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • java调用接口返回乱码问题及解决

    java调用接口返回乱码问题及解决

    这篇文章主要介绍了java调用接口返回乱码问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 基于HttpClient在HTTP协议接口测试中的使用(详解)

    基于HttpClient在HTTP协议接口测试中的使用(详解)

    下面小编就为大家带来一篇基于HttpClient在HTTP协议接口测试中的使用(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Spring MVC数据绑定概述及原理详解

    Spring MVC数据绑定概述及原理详解

    这篇文章主要介绍了Spring MVC数据绑定概述及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java中的基础运算符

    java中的基础运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-08-08

最新评论