java实现远程执行Linux下的shell脚本

背景

最近有个项目,需要在Linux下的服务器内写了一部分Python脚本,业务处理却是在Java内,那么就想能不能在Java里面,来远程执行Linux下的Python脚本,就是把shell命令写到Java里面。于是上网查了下,还真有第三方jar库,ganymed-ssh2。专门给java提供远程执行ssh的一个第三方jar包。

那么什么是 ganymed-ssh2 呢?

Ganymed-SSH2的优点:

轻量级:Ganymed-SSH2的代码非常精简,易于学习和使用。

简单易用:Ganymed-SSH2提供了简单易用的API,尤其适合用于简单的SSH客户端开发。

纯Java编写:Ganymed-SSH2不需要任何本地库或外部依赖,可以在所有支持Java的平台上运行。

导入Jar包

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

我们可以在Maven里面引入 ganymed–ssh2 的jar包。

第一步:远程连接

我们想要去执行Linux下的shell命令,那我们第一步的操作就是应该去连接服务器,先和服务器打通才能进行下一步。

Connection connection = null;
//首先构造一个连接器,传入一个需要登陆的ip地址
    try {
    
    
        connection = new Connection(ip, 22);
        //连接
        connection.connect();
        //身份验证
        boolean isAuthenticated = connection.authenticateWithPassword(username, password);
        if (isAuthenticated) {
    
    
            log.info("身份验证成功");
        } else {
    
    
            throw new Exception("身份验证失败");
        }
         catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
        connection.close();
}

这里就引用了 ganymed–ssh2 的 Connection 方法,需要传入 服务器的Ip以及port端口。

第二步:开启Session

当我们连接上服务器后,我们就需要打开一个Session,来执行我们的脚本shell命令。

Session session = null;
try {
    
    
    //开启openSession
    session = connection.openSession();
    //把命令写入脚本,在执行该脚本
    session.execCommand("这里执行shell脚本");

    session.waitForCondition(ChannelCondition.CLOSED | ChannelCondition.EOF | ChannelCondition.EXIT_STATUS, 1000 * 3600);

  
} catch (Exception e) {
    
    
    e.printStackTrace();
} finally {
    
    
    session.close();
}

如果想要执行的输出结果的话,我们可以加上InputStream输出流,来确认是否执行成功。

// 获得标准输出流
InputStream is = new StreamGobbler(session.getStdout());
BufferedReader brs = new BufferedReader(new InputStreamReader(is, "UTF-8"));
List<String> result = new ArrayList<>();
for (String line = brs.readLine(); line != null; line = brs.readLine()) {
    
    
    result.add(line);
    System.out.println(line);
}
if (result.size() == 0) {
    
    
    System.out.println(result);
}

第三步:新建测试脚本文件

最后,我们在Linux的服务器内,新建立一个test.sh脚本文件。

~

export PATH=/usr/local/bin:/usr/local/lib:$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib
echo '成功执行shell命令'

image.png

这里执行成功的话就输出一行文字。

结果

万事俱备后,我们就来可以运行一下,看一下结果。

image.png

在控制台即可看到,通过InputStream输出流,我们获取到了测试脚本的执行结果。

那通过这,我们就可以来实现,定时执行某些Linux下的python脚本等等。

报错

如果大家按照此方法报错了(估计很大概率会报错),可以看一下我这篇文章,解决报错的方法。

报错解决方法

猜你喜欢

转载自blog.csdn.net/weixin_44427181/article/details/131478638