您的位置:首页 > 运维架构 > Linux

java调用linux命令 传递多个参数和通配符的问题

2014-06-09 18:51 961 查看
简单的不带通配符linux命令调用非常简单,使用Runtime.getRuntime().exec(command)即可,如果要显示错误,或者

输出信息,得到相应的inputStream,既可以打印出信息.

但是对于以下命令:

ls /var/log/nginx/access.log.*

ls /var/log/nginx/access.log.* | grep 2011-05-16

grep "test=123&name=opencfg.com" /var/log/nginx/access.log.* > /root/alert.log

类似这样的命令,process.exec是不会理解其中的*号与> 甚至管道符号|

这是由于在linux环境下,我们一般使用bash shell调用这些命令, 而其中的一些符号 诸如:

*, ?, >, < , | 这样的符号是通过/bin/bash -c来做解释后再传递给 所调用的命令

/bin/bash -c 这个参数已经作为默认命令,在系统启动时加载到运行环境中,所以我们敲以上命令的时候可以省略

但对于java的Process来说,不会识别这些符号,因此我们必须强制调用/bin/bash -c来帮我们做符号解释:

下边是一段测试代码:

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class CommandTest {

public static void main(String[] args) throws Exception {

// 1.test console args commands

// exec("args", args);

String[] commands = new String[] { "/bin/bash", "-c", "grep -h 200.*370.*http /var/log/nginx/access.log.* > /root/test_123.log" };

// String[] commands_ls = new String[] { "/bin/bash", "-c", "ls /var/log/nginx/access.log.*" };

// 1.test java string commands

exec("commands", commands);

}

public static void exec(String message, String[] args) throws Exception {

print(message + ":");

Process process = Runtime.getRuntime().exec(args);

for (String arg : args) {

System.out.println(arg);

System.out.print(" ");

}

BufferedReader errorReader = new BufferedReader(new InputStreamReader(

process.getInputStream()));

String line = null;

while ((line = errorReader.readLine()) != null) {

System.err.println(line);

}

errorReader.close();

BufferedReader infoReader = new BufferedReader(new InputStreamReader(

process.getErrorStream()));

while ((line = infoReader.readLine()) != null) {

System.out.println(line);

}

infoReader.close();

print("");

}

public static void print(String[] args) {

for (String arg : args) {

System.out.println(arg);

System.out.print(" ");

}

}

public static void print(String arg) {

System.out.println(arg);

}

}

只要使用了/bin/bash -c 做为前缀命令,java的Process.exec将会以我们熟悉的方式执行bash shell.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: