Netstat 无法通过 php 函数 exec() 在 FreeBSD 上运行

Netstat 无法通过 php 函数 exec() 在 FreeBSD 上运行

在我的 php-app 中我需要列出所有连接到 80 端口的 IP。我选择了这种方式:

<?php
     $ips = exec("netstat -an |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c", $info);
?>

但它在我的 VPS FreeBSD 服务器上不起作用。当我启动时netstat -an出现通知,输出中没有连接:

netstat: kvm not available: /dev/mem: No such file or directory

我尝试添加device mem到 conf,但我的 /usr/src/sys 是空的。我到了需要重建核心的地步。))

netstat当用户是 root 时(从控制台)可以正常工作。

我在 CentOS 托管平台上没有遇到过这样的问题。

有人能帮我吗?或者也许有其他方法可以解决这个任务

答案1

你有安全模式在 php.ini 中启用了吗?

注意:启用安全模式后,您只能执行 safe_mode_exec_dir 内的文件。出于实际原因,目前不允许可执行文件的路径中包含 .. 部分。

我建议你开始挖掘http://php.net/了解更多信息。这很可能与沙盒chroot监狱或其他类似概念。请注意,在监狱中,并非所有节点/dev/可用。

答案2

在 FreeBSD 上,使用库中的函数kvm从正在运行的内核读取数据。这需要访问设备/dev/mem

由于你可以netstat以 root 身份正常运行,但不能从 PHP 运行,因此我怀疑 PHP 是在监狱. 这种/dev/mem装置在监狱里通常是看不见的。

如果 PHP 确实在 jail 中运行,并且您确实想/dev/mem在该 jail 中公开,则应编辑/etc/devfs.rules并创建一个添加的新规则集/dev/mem,如下所示:

[devfsrules_xtrajail=6]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'mem' unhide

确保您使用的规则集编号小于 5 或​​已定义的规则集编号。

当启动jail时,你应该将参数设置devfs_ruleset为你创建的规则集的编号,在本例中为6。

相关内容