我想用 ant 来执行如下命令:
<exec executable="echo ptc@123 | sudo -S /app/Windchill_10.0/Apache/bin/apachectl -k stop">
</exec>
但它回复错误说
可执行文件和参数周围的 ' 字符不是命令的一部分。
背景是:我想用ant来停止apache服务器,但它不是由我运行命令的同一个用户安装的。
任何人都可以帮助我或给我一些线索吗?
提前致谢
最佳答案
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>
但在这种情况下没有必要,因为您可以只运行 sudo
命令并使用 inputstring
提供其输入,而不是使用管道 echo
:
<exec executable="sudo" inputstring="ptc@123 ">
<arg line="-S /app/Windchill_10.0/Apache/bin/apachectl -k stop" />
</exec>
由于 sudo -S
需要换行符来终止密码,我在
的末尾添加了 inputstring
(这是在 XML 的属性值中编码换行符的最简单方法)。
请注意,<arg line="..." />
在涉及到分词时非常简单 - 如果任何命令行参数可以包含空格(例如,如果您需要引用目录下的文件,例如 ${user.home}/Library/Application Support
,或者如果值被读取来自您无法控制的外部 .properties
文件),那么您必须使用具有 arg
或 value
属性的单独 file
元素自行拆分参数,例如:
<exec executable="sudo" inputstring="ptc@123 ">
<arg value="-S" />
<arg file="${windchill.install.path}/Apache/bin/apachectl" />
<arg value="-k" />
<arg value="stop" />
</exec>
关于java - 我如何使用 ant <exec> 在 linux 上执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883212/