Com zsh
, se estiver em execução como root
e você definir
EUID=1000
Ele irá definir o euid para 1000. O uid real ainda será definido como 0, então você pode voltar para o EUID 0. Qualquer programa que você execute também poderá recuperar privilégios executando setuid()
, mas se a intenção é evitar danos não intencionais ao invés de proteger contra software malicioso, então isso deve ser suficiente.
#! /bin/zsh -
GID=1000 # optional
EUID=1000 # drop *effective* privileges
some-potentially-harmful-command-that-doesnt-need-superuser
and-another
EUID=0 some-command-that-needs-superuser
more-non-privileged-commands
EUID=0 UID=1000 # now drop privileges with no coming back
# alternatively:
# USERNAME=stephane # sets uid, gid, supplementary groups... based on the user db
Observe que você pode definir o EUID / UID ... pela duração de um comando com
UID=1000 the-command
Mas não UID
ou USERNAME
if the-command
está embutido ou uma função como zsh
não separaria um processo diferente, portanto não seria possível restaurar o ID do usuário real.
Você também pode definir EUID
/ UID
/ USERNAME
em uma subshell com:
(EUID=0 USERNAME=stephane; untrusted-application)
(definimos EUID como 0 para poder mudar de usuário depois).