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 sudo
senha apenas uma vez ou precisarei digitar a sudo
senha em cada chamada de um comando dentro do script, que precise de sudo
permissã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 sudo
permissões expirem (se, por exemplo, um comando específico levar tempo suficiente para exceder o sudo
tempo limite)? Ou a sudo
entrada inicial da senha durará toda a duração de todo o script?
fonte
Respostas:
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.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
trecho da página de manual do sudosudo
é 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.fonte
sudo -u $(logname) <command>
Deveria trabalhar.bash
e 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
sudo
tempo limite se aplica apenas à invocação separada (posterior) desudo
. Isso não afetaria o processo bash que você já está executando, ou qualquer um de seus descendentes.fonte
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
sudo
permissões. Geralmente, na parte superior do script, você assume que ele não foi executado comsudo
permissões e, em vez disso, chama asudo -v
si mesmo (que solicitará a senha do usuário) para 'configurar' umasudo
'sessão'. Você pode incluirecho
algum texto explicativo antes do prompt ou substituirsudo
o próprio prompt pelo-p
switch, para informar ao usuário que você precisasudo
acessar alguns comandos.Em seu script, convém chamar
sudo
os 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 delessudo
) se estende além do tempo limite do sudo, você pode ligarsudo -v
no meio para emitir um tipo de 'manter vivo' asudo
sessã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.fonte
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.sudo -u $SUDO_USER
faç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./etc/sudoers.d
usovisudo -c -f /tmp/tempsudoers
para 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 senhaNOPASSWD
, armazenando cada comando / argumento em uma matriz para criar o arquivo.sudo
sessã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