rc.local이 루트로 실행 중이라면 왜 파일을 건드릴 수 없나요?

rc.local이 루트로 실행 중이라면 왜 파일을 건드릴 수 없나요?

나는 그것이 모든 시작에서 사용되기를 원합니다 /etc/rc.local.

예를 들어 내 스크립트가 호출되고 startscript.sh저장 위치 /home/debian는 다음과 같습니다. 먼저 이름이 지정된 파일을 생성하려고 시도한 test.log다음 다른 작업을 수행합니다.

그러나 시작 시 오류를 읽었습니다.touch: cannot touch ‘test.log’: Permission denied

rc.local내 이해에 따르면 루트로 실행되면 실행되는 모든 항목도 루트로 실행되어야 하므로 test.log어쨌든 생성되어야 합니다. 어떻게 이것이 가능합니까?

startscript.sh:

#!/bin/sh
touch test.log
#... other stuff

rc.local단편:

#!/bin/sh -e
#.. other stuff
sh /home/debian/startscript.sh

답변1

이 접근 방식에는 두 가지 문제가 있습니다. 하나는 루트에 의해 실행된다는 점입니다 . 따라서 생성된 모든 파일은 실행 rc.local하지 않는 한 루트가 소유하게 됩니다 . chown둘째, 이는 보안상의 취약점으로, 루트로 실행된 코드는 루트 권한이 없는 사용자에 의해 수정될 수 있습니다.

더 좋은 방법은 다음을 사용하는 것입니다.@재시작cron권한이 없는 사용자를 위한 시간 지정자. 이미 가지고 있다면예약 된 일들파일을 편집하여 이 줄을 추가한 다음 crontab <yourcrontab>명령을 실행합니다. 또는 crontab -e명령을 사용하여 이 줄을 직접 입력하세요.

@reboot /home/debian/startscript.sh

sh로 시작하므로 스크립트를 실행할 필요가 없습니다 #!/bin/sh.

답변2

배포판에서 다음 을 사용하는 systemd경우/etc/rc.local너무 이른, 루트 파일 시스템이 여전히 읽기 전용이거나 다른 파일 시스템이 아직 마운트되지 않은 동안.

.service실행 중인 systemd 파일이 rc.local특정 순서 종속성으로 구성되지 않은 경우 systemd가능한 한 빨리 실행됩니다.

systemctl cat rc-local.service실행 중인 서비스의 전체 정의를 보려면 실행하세요 rc.local. 모든 After=라인에 주의를 기울이고 시스템 시작 프로세스에서 만족할 수 있는 가장 빠른 지점을 고려하십시오. After=구성 요구 사항에 맞게 한두 줄을 추가하는 재정의 파일을 추가할 수 있습니다 .

관련 정보