2012-08-02 6 views
0

먼저이 질문은 this stack overflow question과 관련이 있습니다. 그러나 상황이 약간 달라졌고 내 게시물에 응답이 없습니다.리눅스 소켓 파일 사용 권한을 변경하십시오

내 Dell 데스크탑 워크 스테이션 인 Ubuntu 10.04 32 비트에서 Apache가 실행하는 PHP "프로그램"에 Unix-Domain 소켓을 제공하도록 설계된 서버 프로그램을 개발했습니다. (참고 : umask = 0022) 소켓 파일/home/wmiller/ACT/web_socket_file의 이름을 지정했습니다. (ACT는 제품 이름에 대한 참조입니다)./home/wmiller/ACT는 777의 권한을 가지고 있습니다./home/wmiller/ACT/web_socket_file은 권한 777로 생성됩니다.

이제 테스트 플랫폼 인 Q7 포맷의 Intel 프로세서 보드에 프로그램을 복사합니다. Ubuntu 10.04 32 비트 및 umask = 0022가 있습니다. 동일한 디렉토리, dir에 대한 동일한 777 권한. 그러나 이제는/home/wmiller/ACT/web_socket_file 코드를 실행하면 755 개의 사용 권한이 생기고 Apache/PHP는 rw 또는 rwx 대신 r-x 권한을 얻기 때문에 Unix 도메인 소켓을 열 수 없습니다. Apache는 uid = www-data에서 실행됩니다.

sockaddr_un  webServAddr; 
remove(g_webSocketFileName.c_str());  // to erase any lingering file from last time 

memset(&webServAddr, 0, sizeof(webServAddr)); 
webServAddr.sun_family  = AF_UNIX; 
snprintf(webServAddr.sun_path, UNIX_PATH_MAX, "%s", g_webSocketFileName.c_str()); 

if ((g_webServerSock = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) 
{ 
    PLOG(ERROR) << "Failed to acquire the web Server socket: "; // uses google glog tool 
    return -1; 
} 

그래서 두 가지 모두 시도해 보았습니다. 777의 입출력 + w의

chmod(g_webSocketFileName.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); 

char temp[100]; 
sprintf(temp , "chmod o+w %s\n", g_webSocketFileName.c_str()); 
system(temp); 

시도 권한.

는 난 거기

unlink(g_webSocketFileName.c_str()); 

그러나 어떤 도움을 추가했습니다.

ir는 왜 하나의 컴퓨터에서 작동하고 다른 거의 동일한 컴퓨터에서는 작동하지 않는지에 대한 제안이 있습니까? 소켓 파일을 다른 곳에 두는 것이 나을 것입니까? 표준 장소가 어디 있습니까? 소켓 파일은 어디에 있습니까?

+0

알았습니다! 내가해야 할 일을했을 모든 바인드 후() 문은 chmod()를 이동했고 그것을 작동합니다! –

답변

3

Linux의 경우 을 의 유닉스 도메인 소켓 파일 설명자bind() 전에 호출해야합니다. 이런 식으로 bind() 호출은 지정된 권한으로 파일 시스템 객체를 생성합니다. 이미 바인딩 된 소켓에서 fchmod()을 호출하면 효과가 없습니다.

chmod()을 사용하면 TOCTTOU 경쟁 조건이 발생할 수 있습니다. 가능한 경우 fchmod()을 사용하십시오.

이것은 Linux 관련 해킹입니다. 대부분의 BSD 시스템에서 fchmod()은 소켓 fd에서 실패하고 EINVAL을 설정합니다.


편집.이 시스템에 의존적 인 동작 차이는 땜질하여 발견했습니다. 아마도 가장 좋은 "소스"는 커널 소스 코드 자체 일 것입니다.

FreeBSD의에
  • , 유닉스 도메인 소켓 FD가 단지 아이 노드처럼 만든 것 같습니다, 유닉스 도메인 소켓에 fchmod() 리눅스에 EINVAL(Ref1)
  • 을 설정하는 무 조작으로 정의 것 같습니다 파일 모드 (bitwise-or'ed in)를 사용합니다 (단 S_IFSOCK).(Ref2) 리눅스의 fchmod() 구현은 행복하게 이러한 객체에 대한 변경 사항을 적용합니다. Unix 도메인 소켓을 주소에 바인딩 할 때 파일 시스템 객체를 생성 할 때 파일 모드가 사용됩니다. (Ref3)man 2 stat에 따르면, S_IFSOCK은 POSIX.1-2001에 있습니다. 내가 잘못 소스를 읽으면

, 정정 해줘 주시기 바랍니다.

+0

Linux에서이 작업을 수행 할 수있는 권한이 있습니까? 맨 페이지 (fchmod의 (3), (2) fchmod의 소켓에 대해 전혀 이야기하지 않는 동안)에, 동작은 지정으로 설명되어 있습니다. –

+0

@JonasWielicki 편집. –

+1

리눅스에서 fchmod()를 테스트했습니다. 결합 (결합 전, 듣기 전)의 조합은 효과가 없었습니다. 모든 경우에 0을 반환했지만 파일 권한은 변경하지 않았습니다. chmod() 만 작동했습니다. – Meixner

관련 문제