如何在PHP exec中使用Nmap

时间:2014-08-21 14:53:01

标签: php nmap

我想从PHP调用Nmap。

如果我这样做:

exec('nmap', $output);
var_dump( $output );

它有效,我得到了经典的“Nmap的用法”文字。

但是一旦我尝试运行UDP检查,如

exec('nmap -p 586 -sU xx.xx.xx.xx', $output);
var_dump( $output );

它不再起作用,没有输出。

我错过了什么?

此致

3 个答案:

答案 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
  • 几乎所有IDS规避选项

毋庸置疑,让您的网络服务器以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();