Se o comando requerido não estiver dentro de um bloco (por exemplo, loop ou condicional), você pode dividir o script em três: os comandos anteriores são executados como myuser
, o comando protected é executado com sudo
prompt quando já root
) e os comandos restantes, também são executados como myuser
: -
su - myuser -c myscript-preamble
sudo myscript-protected-command
su - myuser -c myscript-postamble
Mais geralmente, há um truque que você pode usar com sudo
, usando as credenciais salvas: -
sudo -u myuser sudo -S true <<< password 2>/dev/null
su - myuser -c myscript
sudo -u myuser sudo -k
Existem várias considerações - estas são as primeiras que vêm à mente: -
- O script (ou pelo menos a primeira linha) deve ser executado em um arquivo protegido por leitura (
-rwx------
) ou em um diretório protegido por execução (drwx------
), ambos pertencentes aroot
. - O truque requer que
sudo
credenciais sejam lembradas por um tempo definido (um padrão normal) e quesudo
emmyscript
seja executado dentro desse tempo. - Se
myuser
executarmyscript
enquantoroot
estiver executando simultaneamente, as credenciais lembradas serão usadas se o comandosudo
for atingido antes deroot
runssudo -k
.
Como você pode ver, não é uma solução ideal do ponto de vista de segurança, mas pode ser viável em seu ambiente.
Caso contrário, você precisará usar sudo -A
, conforme descrito neste extrato do manual sudo
: -
-A, --askpass
Normally, if sudo requires a password, it will read it from the user's
terminal. If the -A (askpass) option is specified, a (possibly graphical)
helper program is executed to read the user's password and output the password
to the standard output. If the SUDO_ASKPASS environment variable is set, it
specifies the path to the helper program. Otherwise, if sudo.conf(5) contains
a line specifying the askpass program, that value will be used. For example:
# Path to askpass helper program
Path askpass /usr/X11R6/bin/ssh-askpass
If no askpass program is available, sudo will exit with an error.
Para implementar isso, você precisará escrever um programa que verifique se está sendo executado como root
: em caso afirmativo, ele exibe a senha para myuser
(a partir de dados ofuscados, é claro); caso contrário, ele solicitará a senha como normal e exibirá a resposta do usuário.
Então, sim, é possível fazer o que você quer, mas pode envolver uma boa quantidade de trabalho, dependendo do nível de segurança que você precisa.