1

Мне нужно выполнить трассировку TCP с использованием трассировки Linux или другого пакета, но я изо всех сил пытаюсь найти способ сделать запрос из PHP без необходимости использования привилегий sudo.

Поскольку URL будет из запроса пользователя, я не хочу использовать sudo.

Вот пример:

 $url = 'ebay.com';
 $exec = 'sudo traceroute -w 1 -q 1 -T ' . $url;
 $escaped_command = escapeshellcmd($exec);
 $result = shell_exec($escaped_command);

 echo $result;
 var_dump($result);

Этот код работает, но только с sudo или без -T . Без sudo возвращает пустую строку. Без -T traceroute не выживает брандмауэры.

Если это поможет, я на ОС Centos 7.

Примечание: я не могу использовать UDP вместо TCP, потому что он часто блокируется целевым межсетевым экраном.

1 ответ1

0

Вы не можете запустить sudo из PHP, так как Apache не позволит вам сделать это по соображениям безопасности. Вам нужно реализовать traceroute в PHP внутри вашего кода.

Есть несколько таких реализаций, которые можно найти в открытом доступе.

Смотрите, например:

Создание программы traceroute на PHP, код доступен на github.


Другой подход, позволяющий избежать sudo для traceroute, основан на том факте, что traceroute не должен запускаться с правами root; ему просто нужна возможность CAP_NET_ADMIN . Чтобы установить это как файловую возможность для всех пользователей, если ваше ядро поддерживает файловые возможности, а модуль безопасности Linux (SELinux, AppArmor) не блокирует его:

setcap CAP_NET_ADMIN+ep /usr/sbin/traceroute

Код PHP может быть очень простым с использованием popen():

$handle = popen("traceroute www.xxx.com 2>&1", "r");
while(!feof($handle)) {
    $buffer = fgets($handle);
    $buffer = "<p>".$buffer."</p>\n";
    echo $buffer;
}
pclose($handle);

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .