我正在使用java ProcessBuilder类在我的Windows工作站上启动nmap实例。
以下代码会产生异常:
java.io.IOException: Cannot run program "C:\Program Files (x86)\Nmap\nmap.exe -T4 -A -v --max-scan-delay 0ms --min-rate 1000000 --max-retries 0 -oX - 192.168.1.1 ": CreateProcess error=2, The system cannot find the file specified
命令的值是:
C:\Program Files (x86)\Nmap\nmap.exe -T4 -A -v --max-scan-delay 0ms --min-rate 1000000 --max-retries 0 -oX - 192.168.1.1
在命令窗口中正确生成运行命令。
有什么想法吗?
String command = this.getCommand().toString();
ExecutionResults results = new ExecutionResults();
ProcessBuilder procBuilder = new ProcessBuilder(new String[]{command.toString()});
try {
Process e = procBuilder.start();
results.setErrors(this.convertStream(e.getErrorStream()));
results.setOutput(this.convertStream(e.getInputStream()));
答案 0 :(得分:0)
您将整个命令(包括参数)作为ProcessBuilder构造函数的单个参数传递。它需要一个String [],其中第一个项应该是可执行文件的路径,其他项应该是参数。试试
command.split(" ")
而不是
new String[]{command.toString()}
编辑:我看到你的路径中有空格,这会破坏它:(你可以尝试将可执行路径和参数分成两个字符串。构造函数参数将是一个包含路径本身的String []第一个项目,然后是按空格分割的参数数组。
OR:如果你不介意不使用ProcessBuilder,那就更简单了:
Process e = Runtime.getRuntime().exec(command);
答案 1 :(得分:0)
从例外本身来看很简单,
java.io.IOException:无法运行程序" C:\ Program Files(x86)\ Nmap \ nmap.exe -T4 -A -v --max-scan-delay 0ms --min-rate 1000000 --max-retries 0 -oX - 192.168.1.1":CreateProcess error = 2,系统
进程构建器将整条线视为可执行文件并尝试运行它。只需使用以下示例,
ProcessBuilder procBuilder = new ProcessBuilder(new String[]{"C:\Program Files (x86)\Nmap\nmap.exe"});
procBuilder.start();
这样可以正常工作。所以这不是你认为java无法找到可执行文件的问题。它将整行作为可执行文件。你在下面做得更好,
ProcessBuilder procBuilder = new ProcessBuilder(new String[]{"C:\Program Files (x86)\Nmap\nmap.exe", "-T4", "-A"}); //add all params
procBuilder.start();
试试这个,它应该可以正常工作
答案 2 :(得分:0)
正如其他答案所表明的那样,您当前的问题是您传递的是整个命令行,就好像它是要运行的程序的名称一样。 CreateProcess
正在寻找名为“C:\ Program Files(x86)\ Nmap \ nmap.exe -T4 -A etc”的程序,但未能找到它。
如果您有一个包含要运行的命令的字符串(带有参数,重定向等的程序名称),那么运行它的最简单方法是通过命令行处理器启动它。这是一个简单的例子:
public static void main(String[] args) throws IOException, InterruptedException {
String command = "dir /w";
ProcessBuilder procBuilder = new ProcessBuilder(new String[]{"cmd", "/c", command});
procBuilder.redirectInput(Redirect.INHERIT);
procBuilder.redirectOutput(Redirect.INHERIT);
procBuilder.redirectError(Redirect.INHERIT);
Process p = procBuilder.start();
int ecode = p.waitFor();
System.err.println("Exit code " + ecode);
}
答案 3 :(得分:0)
这可能是由于我的经验中的几个原因