利用Java执行Linux环境的脚本,也是我们经常会遇到的场景,这里记录一下代码。
Java执行Linux环境的脚本也是分情况的:
1.如果脚本和Java程序是在一台Linux服务器上的,就不需要通过SSH去登陆,可以直接的操作。
2.如果Java程序和脚本不是一台Linux服务器上的,就需要先通过SSH登陆,再去执行脚本。
1.java程序和脚本是在同一台机器
public void exec(){
//需要执行的命令,这里用Linux环境的date命令做尝试,如果有参数的话,直接拼接成一个字符串,有时候用数组会不起作用
String command = "/bin/date" + " -d now";
BufferedReader br = null;
try {
//创建执行类,jdk1.5之后有了ProcessBuilder,api更加丰富,这里用Process
Process ps = Runtime.getRuntime().exec(command);
//设置超时时间,120s
//网上的说法,ps.waitFor()方法有可能造成死锁,但是有解决的方法,这里就不详细写了
if(!ps.waitFor(120, TimeUnit.SECONDS)){
//RRExceprion是一个自定义的异常类
throw new RRException("exec linux shell timeout,120s");
}
//获取命令的输出,输出是在Linux的console
br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb= new StringBuffer();
String line;
while ((line = br.readLine()) != null){
sb.append(line).append("\n");
}
String result = sb.toString();
}catch(Exception e){
throw new RRException("执行脚本异常");
}finally{
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.Java程序不在同一台机器
这里需要引入第三方的jar包,pom文件如下
<!-- https://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2 -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
public Boolean login(String ip,String username,String password){
boolean flag = false;
try {
//创建连接
connection = new Connection(ip);
connection.connect();
//认证
flag = connection.authenticateWithPassword(username, password);
if(flag) {
System.out.println("认证成功");
}else {
System.out.println("认证失败");
connection.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return flag;
}
public static String execute(String command) {
String result = null;
InputStream in = null;
BufferedReader br= null;
try {
//创建会话
Session session = connection.openSession();
//执行命令
session.execCommand(command);
//获得输出
in = session.getStdout();
InputStream is= new StreamGobbler(in);
StringBuffer buffer = new StringBuffer();
br = new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = br.readLine()) != null) {
buffer.append(line + "\n");
}
result = buffer.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
br.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}

1296

被折叠的 条评论
为什么被折叠?



