我想从PHP调用Nmap。
如果我这样做:
exec('nmap', $output);
var_dump( $output );
它有效,我得到了经典的“Nmap的用法”文字。
但是一旦我尝试运行UDP检查,如
exec('nmap -p 586 -sU xx.xx.xx.xx', $output);
var_dump( $output );
它不再起作用,没有输出。
我错过了什么?
此致
答案 0 :(得分:2)
某些Nmap功能需要root权限才能运行。 -sU
UDP端口扫描就是其中之一。在Linux上,完整列表是:
-sU
UDP端口扫描-sS
TCP SYN扫描-sA/W/M/N/F/X
使用各种标志进行TCP扫描-PE/PP/PM
ICMP主机发现探测器-sO
IP协议扫描-sY/Z
SCTP扫描-O
操作系统检测--traceroute
tracerouting 毋庸置疑,让您的网络服务器以root身份运行Nmap命令可能 NOT A GOOD IDEA 。我还提醒您要严格控制您在Nmap命令行中输入的内容。可以滥用许多Nmap功能来执行任意功能。
答案 1 :(得分:0)
尝试使用反引号运算符(`)运行Nmap。这会将输出返回到变量中。所以:
$output = `nmap -p 586 -sU xx.xx.xx.xx`;
有关反引号操作符的更多信息:http://php.net/manual/en/language.operators.execution.php
答案 2 :(得分:0)
重要提示: NMAP 与网络服务器用户无法完全正常运行(apache,www-data,...)。
只有 root
可以使用NMAP完成所有工作。
我使用popen()
。
$stream = popen('/usr/bin/nmap -p 586 -sU xx.xx.xx.xx', 'r');
while (!feof($stream)) {
//Make sure you use semicolon at the end of command
$buffer = fread($stream, 1024);
echo $buffer, PHP_EOL;
}
pclose($stream);
或者值得一试:
// Start output buffering
ob_start();
// Flush COMPLETE output of nmap
fpassthru('/usr/bin/nmap -p 586 -sU xx.xx.xx.xx');
// Capture output buffer contents
$output = ob_get_contents();
// Shutdown output buffers
ob_end_clean();