Я бы назвал Nmap из PHP.
ЕСЛИ Я это делаю:
exec('nmap', $output); var_dump( $output );
Он работает, я получаю классический текст «Использование Nmap».
Но как только я попытался запустить проверку UDP, как
exec('nmap -p 586 -sU xx.xx.xx.xx', $output); var_dump( $output );
Он больше не работает, без вывода.
Что мне не хватает?
С уважением
Важное замечание: 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();
Для некоторых функций Nmap требуются права root. -sU
Сканирование портов UDP является одним из них. В Linux полный список:
-sU
UDP-порт сканирует -sS
TCP SYN-сканирование -sA/W/M/N/F/X
TCP-сканирование с различными флагами -PE/PP/PM
обнаружения хоста ICMP- -PE/PP/PM
-sO
IP-протоколы сканирования -sY/Z
SCTP-сканирование -O
ОС --traceroute
tracerouting Излишне говорить, что, вероятно, НЕ ХОРОШАЯ ИДЕЯ, чтобы ваш веб-сервер выполнял команды Nmap как root. Я также предостерегаю вас, чтобы быть очень строгим в отношении того, какой пользовательский ввод вы вводите в командную строку Nmap. Множество функций Nmap можно злоупотреблять для выполнения произвольных функций.
Попробуйте использовать оператор backtick (`) для запуска Nmap. Это вернет выход в переменную. Так:
$output = `nmap -p 586 -sU xx.xx.xx.xx`;
Подробнее об операторе backtick: http://php.net/manual/en/language.operators.execution.php