Como configurar um script para ser executado como raiz não interativamente?

2

Eu preciso configurar o seguinte script para executar como root sempre que eu fizer login:

#!/bin/zsh
truncate -s 0 ~yourstruly/.juniper_networks/network_connect/ncsvc.log

Eu sei como executar o script como raiz interativamente (ou seja, através de sudo ), mas não consigo descobrir como fazer o script ser executado como raiz não-interativamente sempre que eu fizer login .

Como posso fazer isso?

FWIW: o script pertence atualmente a root, tem permissões 6755 e o arquivo a ser truncado também é de propriedade de root e possui permissões 0644, mas quando executo o script, a chamada para truncate falha com um " Permissão negada "error.

    
por kjo 02.03.2013 / 00:54

1 resposta

4

As permissões do script são irrelevantes. Setuid e setgid bits são ignorados nos scripts no Linux e na maioria dos outros unices.

Você pode configurar o sudo para permitir a execução deste script sem especificar uma senha, com a tag NOPASSWD . Certifique-se de que sudo não precise estar conectado a um terminal: turno fora da opção requiretty . Observe que a regra NOPASSWD -tagged deve vir antes de qualquer outra regra que permita executar o comando com um prompt de senha, porque a primeira correspondência se aplica. Então, execute visudo :

Defaults !requiretty
kjo ALL = NOPASSWD: /path/to/nc-logs-truncate
kjo ALL = (ALL) ALL

Altere a primeira linha do script para #!/bin/zsh -f , caso contrário, o zsh carregará ~/.zshenv , o que não é desejável aqui.

Agora que respondi a sua pergunta literal, esse provavelmente não é o melhor método. Um chown kjo ~/.juniper_networks/network_connect/ncsvc.log simples garantiria que o arquivo de log pertence a você para que você possa truncá-lo à vontade.

Melhor, mova o arquivo de log em vez de truncá-lo: geralmente é útil manter os logs recentes (por exemplo, comparar os logs de trabalho aos logs que não funcionam se nc falhar). Dê a você mesmo permissão de escrita no diretório (você já pode possuir) e

mv -f ~/.juniper_networks/network_connect/ncsvc.log ~/.juniper_networks/network_connect/ncsvc.log.0
touch ~/.juniper_networks/network_connect/ncsvc.log

Como alternativa, faça um pacote NC mais unixy, diga a ncsvc para gravar seus logs em /var/log e inclua seu log na configuração logrotate .

    
por 02.03.2013 / 01:30