Je dois effectuer un traceroute TCP en utilisant soit le traceroute Linux, soit un autre paquet, mais j'ai du mal à trouver le moyen de faire la requête depuis PHP sans avoir besoin de privilèges sudo.
Parce que l'URL proviendra d'une requête utilisateur, je ne souhaite pas utiliser sudo.
Voici un exemple:
$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);
Ce code fonctionne, mais seulement avec sudo
ou sans -T
. Sans sudo
cela, il retourne une chaîne vide. Sans -T
le traceroute ne survit pas aux pare-feu.
Si cela peut aider, je suis sur un OS Centos 7.
Remarque: je ne peux pas utiliser UDP au lieu de TCP car il est souvent bloqué par le pare-feu de destination.
networking
php
tcp
turrican_34
la source
la source
-T
est l'abréviation de-M tcp
et cette méthode est décrite comme utilisant des connexions semi-ouvertes par défaut et nécessite donc un accès root. Il n’est pas écrit explicitement dans la page de manuel, mais rien n’est écrit sur les autorisations nécessaires. Probablement avec l'option (explicitement non recommandée),tcpconn
il n'aura pas besoin de root car il s'agit d'une opération simpleconnect
.-T
Réponses:
Vous ne pouvez pas utiliser sudo depuis PHP, car Apache ne vous laissera pas faire cela pour des raisons de sécurité. Vous devez implémenter traceroute en PHP dans votre code.
Plusieurs de ces implémentations se trouvent dans le domaine public.
Voir par exemple:
En créant un programme traceroute en PHP , le code est disponible sur github .
Une autre approche pour éviter sudo pour traceroute repose sur le fait que traceroute ne doit pas nécessairement être exécuté en tant que racine; il a juste besoin de la capacité
CAP_NET_ADMIN
. Pour définir cela comme capacité de fichier pour tous les utilisateurs, si votre noyau prend en charge les capacités de fichier et qu'aucun module de sécurité Linux (SELinux, AppArmor) ne la bloque:Le code PHP peut alors être très simple en utilisant
popen()
:la source
cap_net_admin
il a travaillé avec seulementcap_net_raw
commesudo setcap cap_net_raw+ep /usr/bin/traceroute
. Si je coursgetcap /usr/bin/traceroute
je reçois/usr/bin/traceroute = cap_net_raw+ep
. J'ai sélinux en mode permissif pour le moment, donc une fois que je l'activer, je suppose que je vais avoir des problèmes à résoudre.