PHP

[PHP] unlink 함수 사용 시 Permission denied 해결 방법

PHP unlink Permission denied 문제

PHP에서 파일을 삭제하기 위한 함수인 unlink()를 사용하여 파일 쓰기 작업을 하려는데 다음과 같이 에러 메시지가 나타나며 파일이 삭제되지 않는 경우가 생깁니다.

Warning:  unlink(../uploads/test-file.txt): Permission denied in /home/www/html/index.php on line 58

unlink가 수행되지 않는 문제는 크게 2가지가 있습니다.

  • 파일의 경로가 올바르게 지정되어 있는가 / 해당 파일이 존재하는가
  • 파일 또는 디렉토리의 권한이 올바른가

일반적으로 unlink를 하기 위해서 파일에 읽기/쓰기 권한을 주어야 하는데, unlink를 실행하기 전에 chmod() 함수를 실행하여 권한을 부여하면 해결되는 경우가 있습니다.

chmod("/path/to/file", 0777);

그러나 위 함수를 사용해도 아래와 같이 유사한 같은 에러가 나타나는 경우가 있습니다.

Warning: chown(): Permission denied in /home/www/html/index.php on line 56

파일의 경로에도, 권한에도 문제가 없는데 정상적으로 삭제되지 않는 이유는 무엇일까요?

문제를 확인해보니 SELinux 정책으로 인해 삭제되지 않는 것이었습니다. SELinux는 리눅스의 향상된 보안을 위해 고안된 보안 모듈이며 까다로운 권한 정책을 설정하여 서버측에서는 높은 안전을 얻을 수 있으며, 개발자에게는 더 많은 스트레스를 줍니다.

원인을 도통 알 수 없는 권한 문제는 대부분 SELinux 때문이라고 여길 정도이니, 이러한 유형의 문제가 나타난다면 아래 포스트를 참고하여 일시적으로 SELinux를 끄고 테스트해보면 됩니다.

다시 본론으로 들어와서, SELinux를 켠 상태에서 unlink를 수행하고 싶은 경우 해당 디렉토리의 콘텍스트를 chcon 명령어(디렉토리 또는 파일의 콘텍스트를 강제로 변경하는 명령어)를 사용하여 변경해주어야 합니다. 이 명령어는 웹 서비스가 구동되는 서버의 콘솔상에서 root 권한을 가진 계정으로 입력해야 합니다. (이 내용을 잘 모르신다면 서버 관리자에게 문의해보시는게 좋을 듯 합니다.)

[root@localhost]# chcon -t httpd_sys_rw_content_t [path_to_directory_or_file]

[path_to_directory_or_file] 부분에 절대 또는 상대 경로를 포함한 파일/디렉토리 이름이 들어가면 됩니다. 예를 들어 삭제할 파일이 /home/www/html/del 안에 들어있는 경우 chcon -t httpd_sys_rw_content_t /home/www/html/del 과 같이 입력해주시면 됩니다.

이제 다시 unlink를 시도해보시면 별다른 문제 없이 파일이 삭제될 것입니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

1개월 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

7개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

9개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

9개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

9개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

9개월 ago