单引号在Java中执行Linux命令时出现问题

时间:2014-08-26 21:09:49

标签: java linux

我需要使用Runtime.getRuntime()。exec()执行这样的Linux命令:

/opt/ie/bin/targets --a '10.1.1.219 10.1.1.36 10.1.1.37'

基本上,这个命令是将每个目标逐个连接到服务器(10.1.1.219,10.1.1.36,10.1.1.37)。它在终端中运行良好,结果应该是:

['10.1.1.219', '10.1.1.36', '10.1.1.37']

但是如果我使用Runtime.getRuntime()。exec(execute)执行命令,就像这样:

execute = "/opt/ie/bin/targets" + " " + "--a" + " " + "'" + sb
                + "'";

Java会将单引号视为要执行的字符串,结果将为:

callProcessWithInput executeThis=/opt/ie/bin/targets --a '10.1.1.219 10.1.1.36 10.1.1.37' 
The output for removing undesired targets :["'10.1.1.219"] 

任何人都知道如何解决它?谢谢!

1 个答案:

答案 0 :(得分:5)

引用字符由shell解释,以控制它如何将命令行拆分为参数列表。但是当你从Java调用exec时,你没有使用shell;你直接调用程序。当您将单个String传递给exec时,会使用StringTokenizer将其拆分为命令参数,这只会在空格上拆分,并且不会对引号赋予任何特殊含义。

如果您想要更多地控制传递给程序的参数,请调用带有exec参数的String[]版本之一。这会跳过StringTokenizer步骤,并允许您指定被调用程序应接收的确切参数列表。例如:

String[] cmdarray = { "/opt/ie/bin/targets", "--a", "10.1.1.219 10.1.1.36 10.1.1.37" };
Runtime.getRuntime().exec(cmdarray);