Lançar um comando sudo após o término do script?

4

Estou codificando um script bash que:

  • executa algum comando sudoed na inicialização
  • libera permissões de root para fins de segurança ( sudo -K )
  • executa um programa não privilegiado
  • , mas precisa de permissões de root ao finalizar

Estou à procura de um simples & maneira segura de evitar perguntar ao usuário sua senha novamente no término do script .

Estou pensando em um fork antes de sudo -K aguardar para capturar um sinal de termo. Não sei se é a solução mais elegante / segura.

Este é o código:

sudo unshare -m \
  sudo -u "$USER" -g 'id -g -n "$USER"' \
  bash -c \
  "sudo mount --bind \"$MOUNT_DIR\" \"$MOUNT_DIR\"; \
  sudo mount --make-private \"$MOUNT_DIR\"; \
  sudo -K; \
  <unprivilegied program here>; \
  sudo umount \"$MOUNT_DIR\""

NB: Para informações, isso cria uma montagem privada em um namespace que somente o programa terá acesso. unshare -r não é uma opção para executar o programa.

    
por KrisWebDev 06.03.2016 / 22:29

1 resposta

5

Noto que você está fazendo muitas idas e vindas entre o usuário regular e o root:

  • alterne para a raiz para executar unshare
  • volte para o usuário normal para executar bash (embora pareça que você não usa nenhum bashismo, você também pode executar sh , que seria mais portátil e possivelmente mais leve)
  • voltar para a raiz várias vezes dentro desse bash shell para fazer mais coisas privilegiadas

Acho que você pode simplificar isso e reduzir o número de vezes que precisa alternar entre os usuários e resolver seu problema ao mesmo tempo.

sudo unshare -m sh -c '
        mount --bind "$1" "$1";
        mount --make-private "$1";
        exec sudo -u "#$SUDO_UID" -g "#$SUDO_GID" sh -c "
                sudo -K;
                <unprivilegied program here>
        "
' - "$MOUNT_DIR"

Tecnicamente, há um shell de root que é executado continuamente durante a execução da parte não privilegiada, mas a única coisa que o shell fará é aguardar a conclusão da parte não privilegiada e nada mais. Mas se você realmente deseja abrir mão de seus privilégios sudo antecipadamente e não precisar pedir ao usuário para concedê-los novamente, todas as alternativas também envolverão um processo persistente aguardando o sinal para executar o comando umount em alguma forma ou outra.

Como um aparte, é legal que seu comando seja todo auto-suficiente e tudo, e eu mantive esse espírito na minha sugestão, mas honestamente grandes blocos de código fornecidos como uma opção de linha de comando para sh -c são difíceis de escrever e leia e mantenha por causa de todas as complexidades de citação com as quais você tem que se preocupar, e eu recomendo considerá-las em seu próprio script e executar a coisa toda como:

sudo unshare -m /usr/local/bin/script-that-does-the-rest-of-the-work

Além disso, fazer isso tornaria mais fácil escrever suas regras sudo para comandos permitidos, que são difíceis de escrever usando minha sugestão, a menos que você permita que o usuário rode qualquer comando, o que é o mesmo que dar acesso root completo . Nesse caso, você teria que permitir o comando unshare -m sh -c <huge block> "$MOUNT_DIR" , que é um Cmnd_Alias muito difícil de escrever.

    
por 06.03.2016 / 23:26