Executar script de rc.local como usuário em vez de raiz

26

Quero executar um script sempre que meu servidor for iniciado. O problema é que eu preciso ser um determinado usuário para executar o script, se eu tentar fazê-lo como root, ele não poderá encontrar certos pacotes (como ruby).

Eu tento mudar para xxx user01.

sudo su user01
/etc/init.d/script start

Isso não funciona no entanto.

Philip
fonte
Postar seu script init?
Quanta
Você tem alguns logs?
Dom
Por que você simplesmente não usa suno script rc?
Mat
Consulte stackoverflow.com/questions/8940771/… .
Ferdinand Prantl

Respostas:

30

A execução sudo su user01em um script não significa que os seguintes comandos sejam enviados ao shell resultante. De fato, isso provavelmente significa que um novo shell é gerado como user01, que nunca sai!

Duas coisas:

  • Você pode executar um comando como outro usuário, passando o -c 'command...'argumento para su, como su user01 -c '/etc/init.d/script start'.
  • Iniciar um serviço que usa o /etc/init.d a partir do rc.local não é a coisa correta a fazer. Você deseja usar ativar o serviço na inicialização usando suas ferramentas de distribuição, como chkconfigou update-rc.d. Você também não deseja trabalhos no /etc/init.d que não devam ser iniciados como root. Os trabalhos em si podem ficar à vontade para acessar outra conta de usuário, mas devem ser chamados pelo root.
Kyle Smith
fonte
8

Você pode colocar algo /etc/crontabe executá-lo@reboot

@reboot username /etc/init.d/script start
user9517 suporta GoFundMonica
fonte
2
ou no próprio arquivo crontab do usuário.
Jake
4

Você pode simplesmente executar o comando através do sudo desta forma:

sudo -H -u user01 /etc/init.d/script start

-H define a variável de ambiente HOME para a do usuário

-u especifica o nome de usuário para executar como

joetek
fonte
0

Certamente você não pode executar esse script com sudo por causa do requiretty (impõe que os usuários devem estar logados) em sudoers. Você pode querer desativar, o que é um pouco arriscado

Também existe uma ferramenta um pouco antiga chamada runsuid: http://freecode.com/projects/runsuid

HTH

sebelk
fonte