我需要使用 Linux traceroute 或其他包执行 TCP traceroute,但我正在努力寻找一种不需要 sudo 权限就可以从 PHP 发出请求的方法。
因为该 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
您无法从 PHP 运行 sudo,因为出于安全原因,Apache 不允许您这样做。您需要在代码中用 PHP 实现 traceroute。
公共领域中可以找到几种这样的实现。
例如:
使用 PHP 创建跟踪路由程序,代码可用在 github 上。
另一种避免使用 sudo 进行 traceroute 的方法是基于 traceroute 不需要以 root 身份运行的事实;它只需要能力CAP_NET_ADMIN
。要将其设置为所有用户的文件能力,如果您的内核支持文件能力并且没有 Linux 安全模块(SELinux、AppArmor)阻止它:
setcap CAP_NET_ADMIN+ep /usr/sbin/traceroute
(海报表明它与之兼容sudo setcap cap_net_raw+ep /usr/bin/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);