O Linux (como muitas outras variantes do Unix) suporta apenas passar um único argumento para o interpretador de um script. (O interpretador é o programa na linha shebang.) Um script começando com #!/usr/bin/sudo -u bob -- /bin/bash
é executado chamando /usr/bin/sudo
com os argumentos -u bob -- /bin/bash
e /home/alice/script.sh
.
Uma solução é usar um script de wrapper: fazer /home/alice/script.sh
contain
#!/bin/sh
exec sudo -u bob /home/alice/script.real
e coloque o código em /home/alice.script.real
começando com #!/bin/bash
e faça a regra sudo se referir a /home/alice.script.real
.
Outra solução é fazer com que o script se reexecute. Você precisa ter cuidado para detectar a condição desejável corretamente, caso contrário você corre o risco de criar um loop infinito.
#!/bin/bash
if ((EUID != 123)); then
exec sudo -u \#123 /home/alice/script.sh
fi
(onde 123 é o ID do usuário de bob
)
Uma solução simples é dizer às pessoas para executar sudo -u bob /home/alice/script.sh
em vez de executar o script diretamente. Você pode fornecer aliases de shell, .desktop
files, etc.