Se eu sudo executar um arquivo de script Bash, todos os comandos dentro do script Bash também serão executados como sudo?

30

Quero escrever um script de pós-instalação automatizada no Bash (chamado post-install.sh, por exemplo). O script irá adicionar e atualizar automaticamente repositórios, instalar e atualizar pacotes, editar arquivos de configuração, etc.

Agora, se eu executar esse script, por exemplo sudo post-install.sh, com , será solicitada uma sudosenha apenas uma vez ou precisarei digitar a sudosenha em cada chamada de um comando dentro do script, que precise de sudopermissão? Em outras palavras, os comandos dentro do script bash 'herdam' as permissões de execução, por assim dizer?

E, se realmente o fizerem , ainda existe a possibilidade de que as sudopermissões expirem (se, por exemplo, um comando específico levar tempo suficiente para exceder o sudotempo limite)? Ou a sudoentrada inicial da senha durará toda a duração de todo o script?

Dabbler decente
fonte
4
Você pode estar interessado em verificar algumas ferramentas projetadas especificamente para esta tarefa. Três comuns são: Puppet, chef e ancible.
Spuder
@spuder, e para arquitetura e segurança em escala corporativa e em escala maior do seu gerenciamento de configuração, você pode usar o CFEngine 3. (Não para os fracos de coração, nem para comandos únicos.)
Wildcard

Respostas:

38

P # 1: Serão solicitadas apenas uma senha do sudo uma vez ou precisarei digitar a senha do sudo em cada chamada de um comando dentro do script que precise de permissão do sudo?

Sim, uma vez, durante a execução do seu script.

NOTA: Quando você fornece credenciais sudo, a autenticação geralmente é boa por 5 minutos no shell em que você digitou a senha. Além disso, qualquer processo filho que seja executado a partir deste shell ou qualquer script que seja executado no shell (seu caso) também será executado no nível elevado.

P # 2: ainda existe a possibilidade de as permissões do sudo atingirem o tempo limite (se, por exemplo, um determinado comando demorar o suficiente para exceder o tempo limite do sudo)? Ou a entrada inicial da senha do sudo durará toda a duração de todo o script?

Não, eles não terão tempo limite dentro do script. Somente se você os digitar de maneira interativa no shell, onde as credenciais foram fornecidas. Toda vez que sudoé executado dentro desse shell, o tempo limite é redefinido. Mas, no seu caso, as credenciais permanecerão enquanto o script estiver executando e executando comandos a partir dele.

trecho da página de manual do sudo

Esse limite é específico da política; o tempo limite do prompt de senha padrão para a política de segurança do sudoers é de 5 minutos.

slm
fonte
1
A resposta para o primeiro trimestre é "Não, você não será solicitado novamente".
dannysauer
@dannysauer - leia seu Q novamente. Estou dizendo Sim para ser solicitada a senha apenas uma vez!
Slm
A pergunta diz "é a ou b" e apenas dizer "sim" não deixava claro se era "sim, a" ou "sim, b". Apenas tentando esclarecer as coisas para futuros leitores. : D
dannysauer 17/02
@dannysauer - veja a atualização.
Slm
1
Essa nova pergunta seria a seguinte: stackoverflow.com/questions/3522341/… . sudo -u $(logname) <command>Deveria trabalhar.
Gauthier
17

bashe todos os seus processos filhos serão executados com permissões de superusuário. Portanto, você não precisará digitar novamente uma senha para comandos no seu script bash.

O sudotempo limite se aplica apenas à invocação separada (posterior) de sudo. Isso não afetaria o processo bash que você já está executando, ou qualquer um de seus descendentes.

Laurence Gonsalves
fonte
3

Todas essas respostas provavelmente estão corretas. No entanto, essa não é a maneira geralmente usada (pelo que sei) para criar scripts bash que exijam sudopermissões. Geralmente, na parte superior do script, você assume que ele não foi executado com sudopermissões e, em vez disso, chama a sudo -vsi mesmo (que solicitará a senha do usuário) para 'configurar' uma sudo'sessão'. Você pode incluir echoalgum texto explicativo antes do prompt ou substituir sudoo próprio prompt pelo -pswitch, para informar ao usuário que você precisa sudoacessar alguns comandos.

Em seu script, convém chamar sudoos comandos que o exigem (e apenas os comandos que o exigem) sem mais solicitações de senha. Se você acha que um determinado grupo de comandos que são executados juntos no seu script (independentemente do uso deles sudo) se estende além do tempo limite do sudo, você pode ligar sudo -vno meio para emitir um tipo de 'manter vivo' a sudosessão '

Se a sudo'sessão' expirar durante o script, simplesmente será solicitada sua senha na próxima vez que você emitir um comando sudo no script.

alexrussell
fonte
1
Digamos que uma das etapas do script seja a construção de um novo kernel Linux, o que pode levar duas horas. Manter a sessão viva pode ser um desafio, como você lidou com isso?
Gauthier
Você não pode. Mas da próxima vez que você ligar sudo -v, solicitará a senha do usuário novamente. Não é o pior problema na minha opinião. Talvez seja útil, conscientizar o usuário sobre o mecanismo pode ser útil.
alexrussell
O inverso disso é exigir que o usuário chame o script com sudo pelas outras respostas e sudo -u $SUDO_USERfaça com que todos os comandos que não sejam de raiz sejam executados sem elevação. Infelizmente, ele adiciona mais código, mas é a única maneira confiável de executar tarefas de raiz em um processo demorado.
dragon788
Eu acho que devo esclarecer, outra outra maneira de fazer isso seria chamar sudo uma vez no início do script para colocar um arquivo temporário em /etc/sudoers.duso visudo -c -f /tmp/tempsudoerspara garantir que o arquivo seja válido antes de copiá-lo no lugar e, em seguida, removê-lo quando terminar (usando uma interceptação na saída / erro para garantir que a escalação não possa ser abusada). A implementação mais segura e protegida apenas permitiria ao usuário executar comandos específicos em seu script com argumentos específicos sem senha NOPASSWD, armazenando cada comando / argumento em uma matriz para criar o arquivo.
dragon788
Um pouco tarde, volto para @Gauthier aqui, mas parece que eu estava errado quando disse que você não pode manter uma sudosessão viva se uma determinada tarefa demorar mais que o tempo limite. Me deparei com esta técnica no outro dia em dotfiles de Mathias Bynens repo: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell