Executar apenas partes de um script como sudo, digitando a senha apenas uma vez

11

Estou escrevendo um script (na verdade uma combinação de scripts e makefile) que instala dependências externas: alguns apt-get de comandos, alguns git clonando, construindo, instalando, adicionando usuários a grupos, ...

Algumas das operações nesses scripts exigem permissões de superusuário, outras não.

Até agora, executei todo o processo de criação com o sudo, mas tem algumas desvantagens:

  • git repos Eu clonei root como proprietário, o que significa que não posso modificá-los depois sem sudo ou chown
  • os scripts que adicionam usuários a grupos não sabem qual usuário adicionar, pois whoami retorna root

Qual é a melhor maneira de executar como superusuário apenas os comandos que exigem isso? Idealmente, o processo ainda exigiria que eu inserisse minha senha sudo , mas apenas uma vez no início do processo de instalação. Esqueceria isso no final, mas manteria todo o tempo até então (pode levar várias horas).

As soluções que encontrei on-line incluem:

  • sudo -v no início do script, mas se eu entendi corretamente isso expira. Meu script pode estar funcionando por algumas horas
  • executando o script com sudo , mas os comandos que não precisam de superusuário com sudo -u $(logname) <command> . Isso é o que eu faço agora, mas parece que deveria ser o contrário.

Idealmente, gostaria que meu script:

  1. pedir credenciais de superusuário
  2. executa comandos normais como o usuário conectado
  3. execute comandos sudo com as credenciais inseridas na etapa 1
  4. sudo -k para fechar a sessão de superusuário
por Gauthier 13.02.2015 / 11:34

2 respostas

6

Como você tem acesso ao sudo, crie um arquivo sudoers para você mesmo e exclua-o quando o script estiver pronto:

# grant this user access to the sudo commands without passwords
# add all required cmds to the CMDS alias
sudo tee /etc/sudoers.d/$USER <<END
$USER $(hostname) = NOPASSWD: /usr/bin/apt-get, /usr/sbin/adduser, /bin/rm, ...
END

# your script goes here
sudo apt-get install ...
git clone ...
sudo adduser group2 $USER
sudo adduser group1 $USER
: ...

# then, remove the sudo access
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k
    
por glenn jackman 13.02.2015 / 16:02
2

Uma maneira, que eu geralmente não recomendaria, é ler a senha você mesmo e usar a opção sudo -S para passar a senha como e quando necessário:

#! /bin/bash
IFS= read -rsp 'Enter your password: ' password
git clone ...
sudo -S apt-get install foo -y <<<"$password"

De man sudo :

 -S, --stdin
             Write the prompt to the standard error and read the password
             from the standard input instead of using the terminal device.
             The password must be followed by a newline character.
    
por muru 13.02.2015 / 17:35

Tags