
프로세스를 시작하고 중지하는 간단한 init.d 스크립트가 있습니다. 나는 init.d를 루트로 호출하지만 그것이 제어하는 프로세스가 특정 사용자로 실행되도록 하고 싶습니다.
온라인에서 가장 일반적인 제안은 다음과 같습니다.
su myuser -c "my_process args"
그러나 이는 두 번째 프로세스 공간, 새 셸 등을 생성하며 다소 우아하지 않습니다.
나는 쉘을 대체하기 때문에 를 사용하는 것을 선호 exec()
하지만 이것은 사용자를 인수로 사용하지 않습니다. 이것이 제가 setuid()
먼저 사용해야 하는 경우인가요 ? GID 설정은 어떻게 되나요? 알아야 할 문제가 있나요?
또는 init.d를 다른 사용자로 실행하는 배포판 전용 솔루션이 있습니까? 내 환경은 Centos 6.4입니다.
답변1
배포판에 따라 다르지만 RHEL 기반 배포판은 /etc/rc.d/init.d/functions
그 daemon
자체로 명령을 둘러싼 래퍼인 Bash 함수를 사용합니다 runuser
. 소스 파일에서 알 수 있듯이 기능적으로 su
대부분의 경우와 동일하며 PAM을 거치지 않습니다(아마 특정 경우에는 닭고기와 달걀 문제를 피하기 위해).
그것은 실제로 귀하의 반대에 대답할 수는 없지만 서비스가 이를 수행하는 방식입니다. 당신이 원하는 논리에 대한 청결함과 전체적인 일치성은 다음과 같은 일에 대한 동기의 일부입니다.systemd
답변2
의 사용이 su someuser -c ...
필요한 것입니다. 우선, setuid()
쉘 코드에서는 사용할 수 없는 시스템 호출이 있습니다. 필요 이상으로 이것을 어렵게 만들지 마십시오.