Php 套接字_create():无法创建套接字[1]:不允许操作

Php 套接字_create():无法创建套接字[1]:不允许操作,php,laravel,centos7,Php,Laravel,Centos7,我尝试使用socket_create ICMP ping Ip读取数据,在Windows10工作,但CentOS7不工作,错误消息是“socket_create():无法创建套接字[1]:不允许操作”,我还检查了phpinfo()在CentOS7中启用套接字,这是关于根权限的问题吗 我怎样才能修复它 我尝试使用chmod-r4777/var/www/html/MyWeb,但仍然不起作用 /* ICMP ping packet with a pre-calculated checksum */

我尝试使用socket_create ICMP ping Ip读取数据,在Windows10工作,但CentOS7不工作,错误消息是“socket_create():无法创建套接字[1]:不允许操作”,我还检查了phpinfo()在CentOS7中启用套接字,这是关于根权限的问题吗 我怎样才能修复它

我尝试使用chmod-r4777/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

它不能在Linux系统上工作的原因是SOCK_RAW需要Linux上的root访问权限。技术原因可以在Linux手册页中找到

只有有效用户ID为0或CAP_NET_RAW功能的进程才允许打开原始套接字

我不建议您使用root权限运行web服务器

如果您只是想ping另一台服务器,那么可以使用
shell\u exec()

例如:

$ip='8.8.8.8';
echo shell_exec(“ping$ip-C1”);
这将返回:

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
使用
-c1
将ping限制为一次尝试,否则ping命令将很乐意为您重新检查

您需要对返回的字符串进行一点解析,以提取实际需要的任何信息

如果您不拥有运行脚本的服务器(例如共享主机),则可能出于安全原因禁用
exec()
shell\u exec()
命令

重要信息:不要将原始参数从浏览器直接传递到
shell\u exec()
中,否则会很糟糕

另外,如果您只是检查一个网站是否可用,那么您可能会使用cURL。这篇文章的主题有一个建议的方法


回应评论的最新情况:

以root用户身份运行web服务器通常是一个非常糟糕的主意,如果攻击者破坏web服务器应用程序,他们可以访问整个服务器。这就是说,如果它是在一个私人网络上,不能从互联网上访问,那么它可能是好的

本主题中讨论了Ubuntu的一些选项:

我对CentOS没有太多的经验,但我认为这个原则也可以起到同样的作用。但是,我不知道SELinux是否会阻止这些尝试


我想我们已经超出了这个问题的原始范围,我建议你在姐妹网站上问一个新问题。

如果我想以root权限运行我的web服务器,我该怎么办(在CentOS7中)?我进行ICMP ping,这是因为我想向我的控制器发送ping消息请求(它有IP)然后得到它的回复。@YunHong我已经添加了更多的信息来回应你的评论。使用nmap扫描所有的ip怎么样?它比那些方法好吗?@YunHong从PHP调用Nmap类似于调用ping,它需要
shell\u exec()
。此外,许多Nmap功能可能需要根权限,仅为了检查服务器是否处于活动状态,这有点过分。如果我的答案不能满足您的需求,那么您是否介意提供更多关于您试图实现的目标的详细信息。另一台服务器做什么?为什么需要ping它?我最终使用exec(“sudo nmap-sP ips”)查找特定网段的所有IP,为什么要扫描IP?这是因为我正在尝试构建物联网,多个控制器都有自己的ip,这就是原因。我尝试使用exec(“ping-ips”),速度太慢了。英语不是很好。