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 executarsh
, 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.