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를 시도해보시면 별다른 문제 없이 파일이 삭제될 것입니다.
INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…
리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…
JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…
NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…
언제부턴가 윈도우 11을 처음 설치할 때 마이크로소프트(Microsoft) 계정 로그인을 강제로 요구하게 되었습니다. 물론 마이크로소프트 계정이…