【问题标题】:socket_create(): Unable to create socket [1]: Operation not permittedsocket_create():无法创建套接字 [1]:不允许操作
【发布时间】:2019-08-13 02:24:17
【问题描述】:

我尝试使用socket_create ICMP ping Ip读取数据,在Windows10可以工作,但CentOS7不工作,错误消息是“socket_create():无法创建套接字[1]:不允许操作”,我还要检查phpinfo() enable sockets in CentOS7,这个是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

【问题讨论】:

    标签: php laravel centos7


    【解决方案1】:

    它在您的 Linux 系统上不起作用的原因是 SOCK_RAW 在 Linux 上需要 root 访问权限。技术原因可以在 Linux 手册页中找到 https://linux.die.net/man/7/raw

    只有有效用户 ID 为 0 或具有 CAP_NET_RAW 能力的进程才能打开原始套接字。

    我不建议以 root 权限运行您的网络服务器。

    如果您只是想 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 选项的讨论:

    Apache as root on ubuntu

    我对 CentOS 没有太多经验,但我认为原理可以相同。但是,我不知道 SELinux 是否会阻止这些尝试。

    我认为我们有点超出了这个问题的原始范围,我建议您在Server Fault 姊妹网站上提出一个新问题。

    【讨论】:

    • 如果我想以 root 权限运行我的 web 服务器怎么办(在 CentOS7 中)?我做 ICMP ping 那是因为我想向我的控制器发送 ping 消息请求(它有 IP)然后得到它的回应。
    • @YunHong 针对您的评论,我添加了更多信息。
    • 用nmap扫描所有ip怎么样?比那些方法好吗?
    • @YunHong 从 PHP 调用 Nmap 类似于调用 ping,它需要 shell_exec()。此外,许多 Nmap 功能可能需要 root 权限,并且仅用于检查服务器是否处于活动状态有点过分。如果我的回答不能满足您的需求,那么您介意提供有关您要实现的目标的更多详细信息。这个其他服务器做什么?为什么需要 ping 它?
    • 我终于用exec("sudo nmap -sP ips") 找到了某个网段的所有ip,为什么要扫描ip?那是因为我正在尝试构建一个 IOT,并且多个控制器有自己的 ip,所以这就是原因。我尝试使用 exec("ping ips"),它太慢了。英语不太好sor。
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 2023-01-12
    • 2011-09-22
    • 1970-01-01
    • 2015-02-18
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多