我尝试使用socket_create ICMP来ping Ip读取的数据,在Windows10中可以,但是CentOS7不起作用,错误消息是“ socket_create():无法创建套接字[1]:不允许操作”,并且我还检查CentOS7中的phpinfo()enable sockets,这是关于root权限的问题吗?如何解决它...
我尝试使用chmod -R 4777 / var / www / html / MyWeb,但仍无法正常工作
/* ICMP ping packet with a pre-calculated checksum */
$package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
$icmp = getprotobyname("icmp");
$socket = socket_create(AF_INET, SOCK_RAW, $icmp);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
if (@socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, $iface) === false) return false;
socket_connect($socket, $host, 100);
$ts = microtime(true);
socket_send($socket, $package, strLen($package), 0);
if (@socket_read($socket, 255)) {
$result = $host;
} else {
$result = false;
}
socket_close($socket);
错误消息是:
socket_create(): Unable to create socket [1]: Operation not permitted
答案 0 :(得分:0)
在Linux系统上不起作用的原因是SOCK_RAW需要在Linux上具有root用户访问权限。可以在Linux手册页https://linux.die.net/man/7/raw
中找到技术原因。仅允许有效用户ID为0或CAP_NET_RAW功能的进程打开原始套接字。
我不建议您以root特权运行您的Web服务器。
如果您只是想对其他服务器执行ping操作,则可以改用shell_exec()
。
https://www.php.net/shell_exec
例如:
$ip = '8.8.8.8';
echo shell_exec("ping $ip -c 1");
这将返回:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=10.7 ms --- 8.8.8.8 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 10.775/10.775/10.775/0.000 ms
使用-c 1
将ping限制为一次尝试,否则ping命令将很乐意不断为您重新检查。
您需要对返回的字符串进行一些解析,以提取出您实际上要获取的任何信息。
如果您不拥有运行脚本的服务器(例如共享主机),则出于安全原因,可能会禁用exec()
和shell_exec()
命令。
重要:请勿将来自浏览器的原始参数直接传递到shell_exec()
中,否则您会遇到麻烦。
或者,如果您只是检查一个网站是否可用,则可以使用cURL。此帖子主题提供了建议的方法。
curl and ping - how to check whether a website is either up or down?
根据评论进行更新:
以root身份运行Web服务器通常是一个非常糟糕的主意,如果攻击者破坏了Web服务器应用程序,他们就可以访问整个服务器。话虽这么说,但如果它位于无法从Internet访问的专用网络上,那么可能就可以了。
在此主题中对Ubuntu选项进行了一些讨论:
我在CentOS上没有太多经验,但是我认为该原理可以发挥同样的作用。但是,我不知道SELinux是否会阻止这些尝试。
我认为我们已经超出了该问题的原始范围,建议您在Server Fault姐妹网站上提出一个新问题。