Estou olhando para um cenário em que desejo executar um programa/comando sudo
como parte de um teste de software. Os comandos são iniciados a partir de um script Python baseado no subprocess
módulo. Estou tentando evitar ter que executar todo o conjunto de testes com privilégios de superusuário.
Digamos que para o propósito deste exemplo, é top
. Meu comando inicia alguns subprocessos próprios e pode entrar em um impasse. Depois de um tempo limite, quero matá-lo (e seus filhos). A solução óbvia parece ser tornar meu comando o chefe de uma nova sessão/grupo de processos, permitindo-me eliminá-lo e seus filhos de uma só vez. O que NÃO consigo descobrir é como fazer isso funcionar com arquivos sudo
. No meu caso, sudo
é sempre protegido por senha sem exceção e quero mantê-lo assim ... se possível.
- Funciona:
setsid top
- Funciona, mas NÃO gera um novo grupo de processos:
sudo setsid top
- Problemático - difícil obter a senha do root de maneira segura e segura:
setsid sudo top
Não consegui fazer (3) funcionar de forma limpa. Eu mexi com SUDO_ASKPASS
.
O que me surpreendeu foi o fato de que (2) realmente é executado, mas NÃO me fornece o novo grupo de processos desejado.
systemd─┬─ ...
├─kdeinit5─┬─ ...
│ └─yakuake─┬─2*[bash]
│ ├─bash───sudo───top
│ ├─bash───pstree
...
O cenário 2 pode ser corrigido assim, sem o uso de
setsid
:sudo -b command
Isso criará um novo grupo de processos, diretamente abaixo do processo de inicialização do sistema, incluindo o
sudo
comando.Uma palavra de conselho, no entanto: se alguém iniciar um grupo de processos como este com Python's
subprocess.Popen
, o objeto resultantePID
(subprocess.Popen(...).pid
) NÃO pode ser usado para determinar oPGID
uso eventual em um padrão comokill -9 -- -{PGID}
(ele matará o interpretador Python em vez do processo recém-gerado grupo). Minha solução alternativa (requerpsutil
):