如何使用ant <exec>在linux上执行命令?

use*_*661 9 java linux ant

我想使用ant来执行如下命令:

<exec executable="echo ptc@123 | sudo -S /app/Windchill_10.0/Apache/bin/apachectl -k stop">
</exec>
Run Code Online (Sandbox Code Playgroud)

但是它回复了一个错误说

'可执行文件和参数周围的字符不是命令的一部分.

背景是:我想使用ant来停止apache服务器但是我没有安装它运行命令的同一个用户.

有人可以帮忙或给我一些线索吗?

提前致谢

Ian*_*rts 22

Ant的<exec>任务使用Java的Process机制来运行命令,而这并不了解特定于shell的语法,如管道和重定向.如果你需要使用管道,那么你必须通过说出类似的东西来明确地运行shell

<exec executable="/bin/sh">
  <arg value="-c" />
  <arg value="echo ptc@123 | sudo -S /app/Windchill_10.0/Apache/bin/apachectl -k stop" />
</exec>
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,没有必要,因为您可以只运行sudo命令并使用它inputstring来提供输入而不是使用管道echo:

<exec executable="sudo" inputstring="ptc@123&#10;">
  <arg line="-S /app/Windchill_10.0/Apache/bin/apachectl -k stop" />
</exec>
Run Code Online (Sandbox Code Playgroud)

因为sudo -S需要换行符来终止密码,所以我&#10;在最后添加了inputstring(这是在XML中用属性值编码换行符的最简单方法).

请注意,<arg line="..." />在分词时非常简单 - 如果任何命令行参数可以包含空格(例如,如果您需要引用目录下的文件,${user.home}/Library/Application Support或者如果从外部.properties文件中读取值,则你不能控制)然后你必须使用arg带有valuefile属性的单独元素自己拆分参数,例如:

<exec executable="sudo" inputstring="ptc@123&#10;">
  <arg value="-S" />
  <arg file="${windchill.install.path}/Apache/bin/apachectl" />
  <arg value="-k" />
  <arg value="stop" />
</exec>
Run Code Online (Sandbox Code Playgroud)