Depois de lançar um intérprete como root, ele inevitavelmente tem privilégios de root. Para eliminar privilégios, você pode escrever um wrapper de script de shell no qual você altera o usuário e o grupo do processo e inicia o interpretador sem privilégios.
Solução 1: wrapper de script de shell
- Você precisa de um usuário sem privilégios para o qual pode alternar (crie um com
sudo adduser --system --no-create-home [username]
, se necessário, mas sua conta de login deve ser boa) -
inicie
python
comsudo su -c ipython [username]
e verifique se não é privilegiado comimport os os.getuid() # should be [username]'s UID os.geteuid() # should be [username]'s UID import subprocess subprocess.check_call(["sudo", "-i"]) # should raise CalledProcessError
Esta solução fornece apenas flexibilidade suficiente para iniciar o intérprete. Se você quiser escrever código e lidar com partes privilegiadas e sem privilégios, considere a solução 2.
Solução 2: descartar privilégios em python
Caso você queira gerenciar privilégios no interpretador python
:
A decisão de descartar privilégios em seu código não é trivial e precisa levar em consideração a troca entre conforto (você não quer digitar sua senha o tempo todo), segurança (o menor número de código possível deve ser executado com privilégios) e manutenibilidade (tanto código quanto possível não deve se preocupar com privilégios).
Abordagens:
-
sudo
oferece uma maneira de adquirir privilégios para um comando em um intérprete não privilegiado, mas requer interação do usuário e dificulta a execução do código sem privilégios (porque você tem a instruçãosudo
em todos os seus comandos). - Se você iniciar o intérprete com privilégios, poderá descartar privilégios com
os.set[/e/r/s]uid
eos.set[/e/r/s]gid
. A palestra da documentação do python é obrigatória neste caso.
Em geral, você deve escrever o máximo de código possível sem ter que lidar com privilégios e colocar esse código em uma função que exclua privilégios, ou seja, eu não recomendo a abordagem sudo
, também porque isso torna o código dependente em sudo
.