JooTC
php-logo-card-blue

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를 끄고 테스트해보면 됩니다.

Linux 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를 시도해보시면 별다른 문제 없이 파일이 삭제될 것입니다.

이 포스트가 도움이 되었나요?

댓글 남기기

avatar
error: 경고: 무단 콘텐츠 복사 및 사용을 금지하고 있습니다. 이해해주셔서 감사합니다.