프로그램에 쓰기 권한이 필요한 경우 chown으로 어떻게 설정해야합니까? 특히,이 오류를 해결하기 위해 foo의 권한을 프로그래밍하는 것은 무엇입니까?
failed to create pid file '/var/run/bar.pid': Permission denied
답변
foo
파일을 만들거나 쓰려고 하는 프로그램이 있다면 foo
바이너리 의 권한은 중요하지 않지만 실행중인 사용자 는 모든 차이 를 만듭니다.
이 경우 foo
에 작성하려고 /var/run
에 의해 소유되는, root
그리고 에만 쓰기 권한을 루트 .
따라서 sudo foo
PID 파일을 만들려면 프로그램을 실행해야 합니다. 프로그램을 실행하기 전에 루트로 프로그램을 실행할 수 있다는 보안상의 의미를 고려하십시오.
답변
일반적인 접근 방식 : 파일에 액세스하려는 프로세스의 사용자 및 그룹을 결정하십시오. 이것은 종종 소프트웨어 구성 (예 : webservers / mailservers / …)에서 찾을 수 있지만 소프트웨어가 이미 실행중인 경우 다음을 사용하십시오.
ps aux
액세스 권한을 구성하려는 프로세스를 찾으십시오. 첫 번째 열에는 실행중인 사용자 이름이 표시됩니다.
groups <username>
사용자가 속한 그룹을 알려줍니다.
서비스와 일치하도록 파일의 소유자 또는 그룹을 변경하십시오.
참고 1 : 질문이 파일이 / var / run /에 있다고 지적한 것처럼 하나의 프로세스에만 액세스가 필요하다고 가정하고 있습니다. 그렇지 않은 경우 소유자 또는 그룹을 변경해서는 안되지만 프로세스 추가를 고려할 수 있습니다 ‘를 사용하여이 파일 / 폴더에 대한 새 그룹을 작성하십시오.
참고 2 : 보안 시스템 인 apparmor를 사용하면 재미있는 일이 발생할 수 있습니다. 프로세스가 파일 시스템 수준에서 필요한 모든 권한을 가진 파일과 폴더에 프로세스를 쓰지 못하게 할 수 있습니다. 함께 aa-status
하면 당신의 서비스에 대한 특정 규칙이 활성 상태인지 여부를 확인할 수 있습니다.
답변
내가 한 것은 start-stop-deamon이 실행되기 직전에 폴더 생성을 추가하는 것입니다. 스크립트는 일반적으로 시작하는 동안 루트로 실행되기 때문에 작동합니다. 단지 / var / run에 폴더를 만들고 소유자를 즉시 변경하므로 PID를 작성할 수 있습니다.
아래 예에서는 PID를 현재 실행 사용자로 설정 한 / var / run의 하위 폴더가 있는지 확인합니다.이 경우 사용자 ‘pi'(라즈베리에 있으므로).
이 링크는 나에게 매우 교육 적이기 때문에 확인하십시오 : Python 스크립트는 서비스로 실행 되지만 여기서 논의 된 문제는 다루지 않았습니다.
쉘 스크립트의 예제 부분 :
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/power/$DAEMON_NAME.pid
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
if [ ! -d /var/run/power ]; then
mkdir /var/run/power/
chown pi:pi /var/run/power/
fi
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
log_end_msg $?
}