【问题标题】:PHP socket error Permission denied on LinuxPHP套接字错误Linux上的权限被拒绝
【发布时间】:2013-06-06 22:06:58
【问题描述】:

我已经在 Linux 2.6.34 上安装了 php 5.4.13。

我已经使用套接字制作了简单的客户端/服务器页面,但它无法正常工作。

它给出了权限被拒绝的错误

下面是我的php代码

if (false == ($socket = socket_create(AF_INET, SOCK_STREAM, 0)))  // create socket 
{
   $stringData= date("D M d, Y g:i A"). " socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "<br>";
   echo $stringData;
}
else
{
    $timeout = array('sec'=>5,'usec'=>500000);
    socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,$timeout);

    if(false==($result = socket_connect($socket, $host, $port)))
    {
        $stringData= date("D M d, Y g:i A"). " socket_connect() failed: reason: " . socket_strerror(socket_last_error()) . "<br>";
        echo $stringData;
        socket_close($socket);
    }
    else
    {
        $stringData= date("D M d, Y g:i A"). " Socket connected succefully <br>";
        echo $stringData;

        if(false==(socket_write($socket, $command, strlen($command))))
        {
            $stringData= date("D M d, Y g:i A"). " socket_write() failed: reason: " . socket_strerror(socket_last_error()) . "<br>";
            echo $stringData;
            socket_close($socket);
        }
        else
        {
            if(false===($cmd = socket_read ($socket, 65536)))
            {
                //10060 for windows and 11 for linux

              if(10060!=socket_last_error() && 11!=socket_last_error())
              {
                $stringData= date("D M d, Y g:i A"). " socket_read() failed: reason: " . socket_strerror(socket_last_error()) . "<br>";
                echo $stringData;
                socket_close($socket);

              }
              switch(socket_select($r = array($socket), $w = array($socket), $f = array($socket), 5))
              {
                       case 2:
                               $refused=1;  
                               break;
              }
              if($refused==1)
              {
                $stringData= date("D M d, Y g:i A"). " socket_read() failed: reason: Connection Refused <br>";
                $ourFileHandle = fopen(SOCKET_LOG, 'a');
                echo $stringData;
                socket_close($socket);

              }
            }
            else
            {
                echo "<pre>".html_entity_decode(print_r($cmd,true))."</pre>";
            }
        }
    }
}

上面的代码在命令提示符下工作正常,但是当从任何浏览器打开页面时,它会给出错误权限被拒绝。

从终端运行 php 的命令:/usr/local/rootfs/php5/bin/php /www/socket_client.php

【问题讨论】:

  • 什么是操作系统?在某些操作系统中,只有超级管理员可以绑定到低于 1024 的 TCP 端口。
  • 我们在使用 socket_create() 函数创建套接字时收到权限被拒绝错误..
  • 我正在使用内核 2.6.34 版本的 Arm-linux(Amlogic 处理器)板上运行 PHP。
  • 我猜它不是默认启用SE的发行版,那么...
  • en.wikipedia.org/wiki/Security-Enhanced_Linux - SE 中有一些指令会阻止非白名单应用程序打开套接字。

标签: php linux sockets


【解决方案1】:

检查参数“safe_mode”的php.ini设置。它应该是“关闭”。

另一个问题可能是由阻止您的 mod_php(apache 进程)通过套接字连接的“selinux”引起的。 在这种情况下:

# check if it's enabled:
/usr/sbin/sestatus -v
to add the connecting rule:
setsebool httpd_can_network_connect=1

如果你想完全禁用它:

setenforce 0

此外,出于调试原因,请禁用 apache/PHP 上的任何安全模块。例如,如果 Suhosin 正在运行,请尝试禁用它。

【讨论】:

  • safe_mode 选项默认已关闭...我们无权添加 selinux 实用程序,我们可以使用这些实用程序设置 httpd 环境变量。
  • 除了您所说的 SElinux enable 选项外,我们还尝试了各种方法来解决上述问题。您对创建套接字的权限或其他我们可以解决此问题的方法有其他想法吗?
  • 不,先生。我认为 SELinux 正在做它的安全工作
  • 我发现了一些与用户权限相关的新内容,它不允许从 Web 界面创建套​​接字。我可以使用 root 用户从命令提示符运行 php 进程,并且可以成功创建套接字而不会出现任何失败情况。
  • 然后,我创建了一个非 root 用户并登录到该用户并尝试运行套接字 PHP 文件,但当时它也不允许使用命令提示符在终端上创建套接字。
【解决方案2】:

这个问题似乎与PHP无关,但与Apache Web服务器(httpd)的权限有关。

我尝试修复权限问题,但尚未成功。

如果我在 httpd.conf 中禁用用户切换,我的(Unix 套接字)连接就可以工作。但是,这只是一种快速的开发解决方法不是最终解决方案,因为整个 httpd 以这种方式以 root 身份运行。

#User _www
#Group _www

【讨论】:

    【解决方案3】:

    我也遇到过类似的问题:

       <?php
       fsockopen('udp://192.168.1.255', 7, $errno, $errstr, 2);
       ?>
    

    警告: fsockopen(): 无法连接到 /var/www/html/udp.php 第 1 行中的 udp://192.168.1.255:7(权限被拒绝)

    致命错误:未捕获异常:无法打开 UDP 套接字:权限被拒绝

    php.ini 如果服务器让你改变这个配置:

    allow_url_fopen = On      // Was On
    allow_url_include = Off   // On Didn't change the problem
    

    终端检查防火墙:

    ufw status
    Status: Inaktiv
    
    /usr/sbin/sestatus -v
    SELinux status:        disabled
    

    解决方案:

    不允许广播到192.168.1.255,我改成对应的IP地址,即192.168.1.24

    默认情况下,袜子会禁用广播。 socket_set_option 命令启用广播消息。

    PHP 官方网站上的以下脚本:

    <?php
    # Wake on LAN - (c) HotKey (at SPR dot AT), upgraded by Murzik <tomurzik@inbox.ru>
    
    flush();
    
    function WakeOnLan($addr, $mac)
    {
    $addr_byte = explode(':', $mac);
    $hw_addr = '';
    
    for ($a=0; $a < 6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
    
    $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
    
    for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
    
    // send it to the broadcast address using UDP
    // SQL_BROADCAST option isn't help!!
    $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    if ($s == false)
    {
    echo "Error creating socket!\n";
    echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
    }
    else
    {
    // setting a broadcast option to socket:
    $opt_ret = socket_set_option($s, 1, 6, TRUE);
    if($opt_ret < 0)
    {
    echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
    }
    $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
    echo $e;
    socket_close($s);
    echo "Magic Packet sent (".$e.") to ".$addr.", MAC=".$mac;
    }
    }
    
    #WakeOnLan('yourIPorDomain.dyndns.org', 'your:MAC:address');
    #WakeOnLan('192.168.0.2', '00:30:84:2A:90:42');
    #WakeOnLan('192.168.1.2', '00:05:1C:10:04:05');
    
    //if you have switch or other routing devices in LAN, sendign to
    // the local IP isn't helps! you need send to the broadcast address like this:
    WakeOnLan('192.168.0.255', 'xx:xx:xx:xx:xx:xx'); 
    

    第一个人

    附加信息:

    https://www.php.net/manual/de/function.fsockopen.php

    fsockopen() enabling it in PHP.ini

    https://serverfault.com/questions/371000/how-to-enable-fsockopen-function-in-php

    https://ubuntuforums.org/showthread.php?t=919407

    https://forum.qnap.com/viewtopic.php?t=39154

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 1970-01-01
      • 2013-12-22
      • 2018-07-25
      • 1970-01-01
      • 2012-07-01
      • 2014-03-31
      • 1970-01-01
      相关资源
      最近更新 更多