Estou escrevendo um pequeno programa utilitário. Eu gostaria que tentasse sudo
executar algo, se necessário.
Ou seja: se as permissões do arquivo não permitirem que o usuário atual opere em um arquivo específico (e as sudo
regras permitiriam), eu gostaria que meu utilitário sudo
executasse algo como o proprietário do arquivo.
Espero verificar essa capacidade antecipadamente, porque eu preferiria que os logs do sistema não fossem preenchidos com ruído devido a sudo
tentativas falhas . Como sudo
ele próprio relata a falha: "Este incidente será relatado".
Então, espero verificar programaticamente: pode user <x>
executar command <y>
via sudo
?
Aqui está o problema: enquanto /etc/sudoers
contém esse mapeamento, ele é de propriedade da raiz e não pode ser lido por usuários comuns.
Eu estava pensando em gerar um subprocesso para executar sudo -l
(que gera comandos que o usuário atual pode executar com sudo). Eu então analisaria a saída disso. No entanto, isso parece um pouco frágil. O resultado contém as informações que eu quero, mas parece que ele foi projetado para humanos lerem (não para consumo programático). Não sei se existe alguma garantia de que a saída seguirá o mesmo formato no futuro ou em plataformas diferentes.
A análise programática da sudo -l
produção é considerada segura? Caso contrário, existem opções melhores para determinar antecipadamente se um comando sudo seria bem-sucedido?
(informações gerais sobre X / Y: este utilitário é para ser usado por uma conta de função de acesso limitado. Espero que outros usuários efetivamente optem por permitir que a conta de acesso limitado opere em seus arquivos por meio de regras sudo. No entanto, ganhei saber antecipadamente qual desses outros usuários possui a regra relevante do sudo)
Respostas:
De acordo com a página de manual do sudo:
então isso vai se resumir a
Como apontado por Muru, use um
-U $USER
ou-U $USERTOTEST
ou nada, dependendo da sua necessidade.fonte
$USER
dizer o usuário atual, você pode simplesmente fazê-losudo -l <command>
, sem-U $USER
.(targetUser) ALL, !/usr/bin/foo
.. nesse caso,sudo -l -u targetUser /usr/bin/foo
ainda pareçam/usr/bin/foo
sair e sair com status 0. Ainda assim, é basicamente o suficiente para minha verificação simples e é melhor do que analisar asudo -l
saída mais detalhada .