Os serviços padrão para iniciar como root
no momento da inicialização na minha caixa RHEL. Se bem me lembro, o mesmo vale para outras distribuições Linux que usam os scripts init /etc/init.d
.
Em sua opinião, qual é a melhor maneira de executar os processos como um usuário (estático) de minha escolha?
O único método que eu tinha chegado era usar algo como:
su my_user -c 'daemon my_cmd &>/dev/null &'
Mas isso parece um pouco desarrumado ...
Existe alguma mágica escondida que fornece um mecanismo fácil para iniciar automaticamente os serviços como outros usuários não-root?
Edição: Eu deveria ter dito que os processos que estou iniciando nesta instância são scripts Python ou programas Java. Prefiro não escrever um wrapper nativo em torno deles, então, infelizmente, não consigo chamar setuid (), como sugere Black .
Respostas:
No Debian, usamos o
start-stop-daemon
utilitário, que lida com arquivos pid, alterando o usuário, colocando o daemon em segundo plano e muito mais.Eu não estou familiarizado com o RedHat, mas o
daemon
utilitário que você já está usando (definido em/etc/init.d/functions
, btw.) É mencionado em todos os lugares como o equivalente astart-stop-daemon
, portanto, também pode alterar o uid do seu programa ou a maneira como você faz já é o correto.Se você olhar em volta da rede, existem vários invólucros prontos que você pode usar. Alguns podem até já estar empacotados no RedHat. Dê uma olhada
daemonize
, por exemplo.fonte
/etc/init.d/skeleton
. Adicione variáveis UID, GID e emdo_start()
uso:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
está definido nas/etc/rc.d/init.d/function
minhas caixas RHEL e CentOS.Depois de analisar todas as sugestões aqui, descobri algumas coisas que espero que sejam úteis para outras pessoas na minha posição:
hop está certo em me apontar de volta para
/etc/init.d/functions
: adaemon
função já permite que você defina um usuário alternativo:Isso é implementado envolvendo a invocação do processo com
runuser
- mais sobre isso posteriormente.Jonathan Leffler está certo: há setuid em Python:
Ainda acho que você não pode configurar de dentro de uma JVM, no entanto.
Nem
su
nemrunuser
graciosamente lidar com o caso onde você perguntar para executar um comando como o usuário que já estão. Por exemplo:Para solucionar esse comportamento de
su
erunuser
, mudei meu script init para algo como:Obrigado a todos por sua ajuda!
fonte
Se você pretende escrever seu próprio daemon, recomendo chamar setuid (). Dessa forma, seu processo pode
fonte
Apenas para adicionar outras coisas a serem observadas:
fonte
em uma máquina virtual CENTOS (Red Hat) para servidor svn: editada
/etc/init.d/svnserver
para alterar o pid para algo que o svn possa escrever:e opção adicionada
--user=svn
:O pidfile original era
/var/run/svnserve.pid
. O daemon não foi iniciado porque apenas o root poderia escrever lá.fonte
Algumas coisas a observar:
Eu geralmente uso / sbin / su para alternar para o usuário apropriado antes de iniciar daemons.
fonte
Por que não tentar o seguinte no script init:
Funcionou para mim.
fonte
setuid: command not found
Eu precisava executar um aplicativo .jar Spring como um serviço e encontrei uma maneira simples de executá-lo como um usuário específico:
Alterei o proprietário e o grupo do meu arquivo jar para o usuário que eu queria executar. Em seguida, vinculou este jarro no init.d e iniciou o serviço.
Assim:
fonte