
Eu tenho um script init.d simples que inicia e interrompe um processo. Eu chamo init.d de root, mas gostaria que o processo que ele controla fosse executado como um usuário específico.
A sugestão mais comum online parece ser fazer
su myuser -c "my_process args"
No entanto, isso cria um segundo espaço de processo, um novo shell, etc., e é um tanto deselegante.
Eu preferiria usar exec()
, pois substitui o shell, mas não leva um usuário como argumento. Este é um caso em que devo usar setuid()
primeiro? Que tal definir o gid? Há alguma dica a ser observada?
Como alternativa, existem soluções específicas da distribuição para executar o init.d como um usuário diferente? Meu ambiente é Centos 6.4.
Responder1
Depende da distribuição, mas as distros baseadas em RHEL usam uma função Bash que eles originam e /etc/rc.d/init.d/functions
que é chamada, daemon
que é apenas um wrapper em torno do runuser
comando. Pelo que posso dizer nos arquivos de origem, é funcionalmente idêntico su
na maioria dos casos, apenas não passa pelo PAM (provavelmente para evitar alguns problemas do ovo e da galinha em certos casos).
Isso realmente não vai responder às suas objeções, mas é como os serviços fazem isso. A limpeza e a conformidade geral com a lógica que você deseja fazem parte da motivação para coisas comosystemd
Responder2
O uso de su someuser -c ...
é o que é necessário. Para começar, setuid()
uma chamada de sistema não está disponível para código shell. Não torne isso mais difícil do que o necessário.