Iniciar processo como outro usuário / grupo (no script init.d)

10

Estou editando um script init.d. O script init.d executa um script utilitário que, em seguida, executa um processo. Em qualquer um dos scripts do bash, como eu faria para iniciar o processo principal como um usuário e grupo específico?

Stéphane Gimenez
fonte

Respostas:

12

A maneira mais simples é usar o comando su (1), ele possui uma opção que permite executar um comando através do shell do usuário, por exemplo:

su foo -c ls

Isso mudará para o usuário foo e executará o comando ls. Se o usuário que você deseja usar não tiver um shell válido (ou seja, não estiver em / etc / shells, como / bin / false ou / sbin / nologin), você também precisará especificar um shell na linha de comando. Exemplo com saída:

# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
ckk
fonte
su parece não gostar, eu dou muitos argumentos. Eu recebo Usage: su [options] [LOGIN]esu: unrecognized option '--debug'
Não está exatamente funcionando. Quando executo esta linha como root, recebo um erro su www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &se su www-datadefinir todos os vars e executá- ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &lo. Como assim eu resolvo isso?
2
@ acidzombie24 suusa um único argumento, que é um comando shell. Você precisa escrever su www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'e se certificar de que MONOSERVERe WEBAPPSsão exportados pelo shell pai. (Nota: não faça su … -c "$MONOSERVER …"como isso falhará se alguma das variáveis ​​contiver caracteres especiais do shell.) E se você tiver um iniciador de daemon dedicado , comostart-stop-daemon , use-o.
Gilles 'SO- stop be evil'
Gilles: Tudo bem, não estou substituindo o script init.d por isso, sou eu? Eu posso colocar todas as variáveis ​​em um novo script e iniciar isso, pois é fácil e eu não precisaria aprender nada. Mas o que há de tão especial no start-stop-daemon? Vou deixar um comentário sobre essa resposta
É melhor usar su ou su -login? Eu li o homem de su, mas eu não consigo entender para este caso específico
Massimo
4

Se start-stop-daemonestá disponível em seu sistema, você provavelmente deve usá-lo e ter um olhar para as suas opções (especialmente -ue -g, neste caso).

(Caso contrário, você pode usar uma combinação de sue sg.)

Atualização: Aqui está um exemplo de algum /etc/init.d/mpdscript (que usa start-stop-daemon):

  • Comando Iniciar:

    echo "Starting Music Player Daemon"
    start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
        --pidfile /var/run/mpd.pid --make-pidfile \
        -- --no-daemon /etc/mpd.conf 2>/dev/null
    

    Tudo o que se segue --é um argumento para o /usr/bin/mpdpróprio programa. (O procedimento de daemonization é tratado pelo script start-stop-daemon, portanto, mpdé solicitado que você não se importe com isso --nodaemon.)

  • Comando de parada:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

Se mpdnão estava caindo privilégios por si só, seria preciso adicionar (por exemplo) -u mpd, -g mpdopções para o start-stop-daemoncomando.

Stéphane Gimenez
fonte
Não estou substituindo o script init.d pelo start-stop-daemon, sou eu? não seria mais fácil usar su e um arquivo de script? Se eu substituir init.d, como instalo para executar na inicialização? o que estou passando para o start-stop-daemon? -edit- estou pesquisando exemplos ATM talvez eu não vou precisar de uma resposta, mas eu sinto que o seu vai ser uma resposta complexa
2
Sem sorte Aqui está a minha linha. Ele ainda roda como root. Eu verifiquei as páginas de manual e ainda não sei o que fazer sobre isso. start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid