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

标签 java linux ant

我想用 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&#10;">
  <arg line="-S /app/Windchill_10.0/Apache/bin/apachectl -k stop" />
</exec>

由于 sudo -S 需要换行符来终止密码,我在 &#10; 的末尾添加了 inputstring(这是在 XML 的属性值中编码换行符的最简单方法)。

请注意,<arg line="..." /> 在涉及到分词时非常简单 - 如果任何命令行参数可以包含空格(例如,如果您需要引用目录下的文件,例如 ${user.home}/Library/Application Support,或者如果值被读取来自您无法控制的外部 .properties 文件),那么您必须使用具有 argvalue 属性的单独 file 元素自行拆分参数,例如:

<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>

关于java - 我如何使用 ant <exec> 在 linux 上执行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20883212/

相关文章:

linux - 在 sed 中编程 rev

java - 如何使用命令 "[javac] error: invalid target release: 12.0.1"解决 "ant run"

java - 创建线程时出现 NullPointerException

Java:在两个线程中加载同一个动态库(两个线程在同一个JVM中)

c++ - Linux C++ 读取 UART 设备工作不一致

c - 什么可能会延迟我的 select() 调用?

java - 使用 ant 处理自定义属性

xpath - 如果 XML 文件具有不同 namespace 中的元素,则使用 XMLTasks 的 ant 的 XMLPath 无法匹配

java - 在同一按钮上同时使用 JSF ajax 和 setPropertyActionListener 标记

创建文本文件时Java NullpointerException