2013-08-06 442 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^_ ^ –