2013-08-06 3 views
3

좋아, PHP를 실행하는 좋은 서버가있어서이 작은 함수를 사용하여 AF_UNIX 소켓을 열었습니다. 그래서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 요청에서 호출 서버에서 데이터를 가져온 다음 해당 데이터를 다시 웹 페이지로 반환하십시오. 아약스 요청은 javascript로 이루어집니다. AJAX 요청없이 클라이언트/서버 연결을 테스트 한 결과이 작동하지만 웹 페이지를 통해 AJAX를 시도하자마자 클라이언트는 "socket_connect() failed, reason : Permission denied"라는 echo 문을 반환합니다. 스크립트. 아마 내가 놓친 작은 감시가있을거야? 나는 Ajax가 httpd (apache)를 통해 호출되고 있다고 가정한다. 나는 그것이 아마 어떤 형태의 파일 허가 일 것이라고 확신하지만, 그 원인을 정확하게 파악할 수는 없다.

것들 내가 지금까지 따라서 시도했습니다

제작해야합니다 safe_mode가이 는 SELinux를 사용 방해하려고 시도 "에 setsebool -P httpd_can_network_connect"시도는 php.ini에서 벗어났다, 는 "위해 setenforce 0"시도 아무런 차이도 없었습니다. /tmp 및 모든 하위 디렉토리의 파일 사용 권한을 777로 변경해 보았습니다. 누군가가 AJAX에 관심이>

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

경우 - 내가 아이디어의 부족 어쩌면 누군가가 전에이 문제를 보았다고 생각하고있어, 나는 또한 나의 서버가 생성되는 파일 인이 바라 보았다 이 전화를 사용하십시오.

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

아약스 호출은 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를 사용하는^_ ^ –