PHP套接字错误在Linux上被拒绝


PHP socket error Permission denied on Linux

我在Linux 2.6.34上安装了php 5.4.13。

我有一个简单的客户端/服务器页面使用套接字,但它没有工作。

给出permission denied error

下面是我的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>";
            }
        }
    }
}

以上代码在命令提示符下工作正常,但当从任何浏览器打开页面时,它会给出错误Permission denied。

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

检查您的php.ini设置中的参数"safe_mode"。应该是"Off"

另一个问题可能是由"selinux"阻止您的mod_php (apache进程)通过套接字连接引起的。在本例中:

# 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,如果它正在运行。

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

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

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

#User _www
#Group _www

我也遇到过类似的问题:

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

警告: fsockopen():无法连接到udp://192.168.1.255:7 (Permission denied) in/var/www/html/udp.php on line 1

Uncaught Exception: Cannot open UDP socket: Permission denied in

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'); 

hth某人

附加信息:

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

fsockopen()在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

在我的例子中,.sock文件对运行php (apache)的用户没有足够的权限。

比较容易修改