java实现远程执行Linux下的shell脚本
- 背景
- 导入Jar包
- 第一步:远程连接
- 第二步:开启Session
- 第三步:新建测试脚本文件
- 结果
- 报错
背景
最近有个项目,需要在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 {//开启openSessionsession = 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命令'
这里执行成功的话就输出一行文字。
结果
万事俱备后,我们就来可以运行一下,看一下结果。
在控制台即可看到,通过InputStream输出流,我们获取到了测试脚本的执行结果。
那通过这,我们就可以来实现,定时执行某些Linux下的python脚本等等。
报错
如果大家按照此方法报错了(估计很大概率会报错),可以看一下我这篇文章,解决报错的方法。
报错解决方法