2013-08-06 377 views
3

好的,所以我有一个很好的php服务器运行,使用我写的这个小函数打开了AF_UNIX socet。这被称为像这样PHP socket_connect()权限被拒绝

$IPC_connector = socket_create_IPC('/tmp/connection'); 


function socket_create_IPC($FILE) 
{ 
    #Create a AF_UNIX socket 
    if(!($socket = socket_create(AF_UNIX, SOCK_STREAM, 0))) 
    { 
     $errorcode = socket_last_error(); 
     $errormsg = socket_strerror($errorcode); 

     die("Couldn't create socket: [$errorcode] $errormsg \n"); 
    } 

    #Bind 
    if(!socket_bind($socket, $FILE)) 
    { 
     $errorcode = socket_last_error(); 
     $errormsg = socket_strerror($errorcode); 

     die("Could not bind socket : [$errorcode] $errormsg \n"); 
    } 

    if(socket_listen($socket) === false) 
    { 
     die("socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n"); 
    } 

    socket_set_nonblock($socket); 

    return $socket; 
} 

然后我写了连接到该服务器这样

if(!($IPC = socket_create(AF_UNIX, SOCK_STREAM, 0))) 
{ 
    $errorcode = socket_last_error(); 
    $errormsg = socket_strerror($errorcode); 

    die("Error:Couldn't create socket - [$errorcode] $errormsg \n"); 
} 
echo "socket_create(): ".socket_strerror(socket_last_error($IPC))."\n"; 

if(!(socket_connect($IPC, '/tmp/connection'))) 
    echo "socket_connect() failed, reason: ".socket_strerror(socket_last_error($IPC))."\n"; 

客户端客户实际得到的从网页中的AJAX请求中,它应该连接到被叫服务器,获取一些数据,然后将该数据返回到网页。 ajax请求是在javascript中进行的。 我测试了没有AJAX请求的客户端/服务器连接,它的工作原理是,但只要我通过网页尝试使用AJAX,客户端返回“socket_connect()失败,原因:权限被拒绝”剧本。也许我错过了一些小小的疏忽?我认为Ajax通过httpd(apache)被调用。我相信这可能是某种类型的文件许可的事情,但我无法弄清楚究竟是什么导致了它。

事情我已经试过这样远

确信safe_mode设置为关闭在php.ini, 试图 “setsebool -P httpd_can_network_connect的” 企图阻挠SELinux的, 也试过 “setenforce 0”这也没有什么区别。 我试图将/ tmp和所有子目录的文件权限更改为777无济于事。 我跑出来的想法和想,也许有人以前见过这个问题, 我也看了这个,这是我的服务器创建文件 - >

[[email protected] tmp]# ls -lZa connection 
srwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 connection 

如果有人感兴趣的AJAX打电话给我用

function communication (IP, MechanismID, CommandName) { 
    $.post('php/connectDisconnect.php', { 
     IP : IP, 
     MechanismID : MechanismID, 
     CommandName : CommandName 
     }, 
     function(data) { 
      if(data.search("Error") != -1) 
       alert(data); 
    }); 
} 

其中connectDisconnect.php是上面的客户端。

+0

目前没有时间阅读完整的Q,但首先想到的是同一起源限制。 (我会稍后删除,如果我走了。) – TecBrat

+0

@TecBrat - 我看了一下“同源政策”,但我不太确定它适用于此,我可能是非常错误的,但它似乎该政策是从网上其他地方获取数据。我的问题是连接在同一台服务器上运行的两个php脚本? - 打开这个让我回答,但我很感谢你。 –

+0

就像我刚才说的,我早点冲过去,没有读完整个问题,但我很高兴它能让你得到一个很好的答案。 – TecBrat

回答

0

事实证明,ajax调用以apache用户身份运行,并且从我的服务器为套接字创建的文件由root拥有。我通过将这些几行代码添加到我称之为socket_create()的服务器来解决此问题。

#Deletes the old pipe in case the server crashed last time it closed and didn't use socket_close() 
$command = "rm -f /tmp/connection"; 
exec($command); 

#Creates the data pipe for the webpage to connect to 
$IPC_connector = socket_create_IPC('/tmp/connection'); 

#Makes it to where the webpage can actually talk to the server 
$command = "chown apache:apache /tmp/connection"; 
exec($command); 

这是一个足够好的解决方法,我想它不是正确的方法去做这件事。如果有人有更好的建议或更好的做法,你会建议我想听到它。

+0

作为对其他人的看法,这个问题解决了这个问题,只要setenforce 0适用于SELinux,我仍然试图解决拒绝我这个权限的SELinux问题。 –

+0

我通过http://wiki.centos.org/HowTos/SELinux在他们的列表中使用第7号修复了这个问题。它使用audit2allow^_ ^ –