Eu fiz alguns testes. Não é (ainda) completamente claro para mim como sudo
armazena a capacidade de elevar. Provavelmente tem algo a ver com pseudo-terminal sendo alocado ou não.
Se eu fosse você, eu implementaria o que você pode ler nesta pergunta: Como faço para executar um comando sudo
dentro de um script? Especialmente em uma das respostas :
It is rarely a good idea to have
sudo
inside scripts. Instead, remove thesudo
from the script and run the script itself withsudo
exceto no seu caso, é da sua gsudo
que estamos falando. Além disso, eu usaria $SUDO_USER
, se necessário (de esta outra resposta ).
Exemplo run-something
:
#!/path/to/my/gsudo /bin/bash
# The shebang ensures the below code is for sure run with gsudo bash;
# gsudo runs sudo, which sets $SUDO_USER (see 'man sudo').
command1 # This is run with gsudo because the entire script is.
# Get back to the invoking (possibly regular) user for just one command
sudo -u "$SUDO_USER" command_whatever
# Again as root
command2
command3
# Get back to the invoking user for many commands
sudo -u "$SUDO_USER" bash << EOF
foo
bar
baz
EOF
Meu gsudo
seria muito simples:
#!/bin/bash
SUDO_ASKPASS='/path/to/my/gsudo_helper' sudo "$@"
e gsudo_helper
:
#!/bin/bash
zenity --password --title "Enter your password" 2> /dev/null
Notas:
- Eu deliberadamente não uso
sudo -A
no códigogsudo
. Dessa forma,gsudo
usa um terminal, se disponível,zenity
caso contrário. - A sintaxe
sudo "$@"
permite quegsudo
passe opções de linha de comando (como o mencionado-A
) parasudo
. Essa é uma boa ideia, mas se você não quiser, consideresudo -- "$@"
.