Quero verificar se o usuário atual que está executando um script de shell BASH tem acesso ao sudo sem senha ou não. Caso contrário, prefiro que o script seja encerrado em vez de solicitar uma senha.
relate perguntas
-
Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?
-
Inicie/pare o serviço systemd usando o atalho de teclado [fechado]
-
Necessidade de algumas chamadas de sistema
-
astyle não altera a formatação do arquivo de origem
-
Passe o sistema de arquivos raiz por rótulo para o kernel do Linux
Se tudo o que você deseja verificar é se o usuário tem acesso sem senha
sudo
, basta executarsudo -n
. Deman sudo
:Isso significa
sudo -n
que retornará apenas um erro, a menos que o usuário possa executarsudo
sem uma senha. O exemplo mais complexo foiSUDO_ASKPASS
determinar se o usuário tinha permissão para executarsudo
, a verificação de ausência de senhasudo
é mais simples. Você pode simplesmente fazer algo como:Ou mesmo
Ou, em um script, se você quiser apenas sair:
Claro, isso apenas verifica se o usuário pode executar
sudo
comandos sem senha. Ele não faz distinção entre o caso de um usuário que já foi autenticado e está dentro dosudo
tempo limite, portanto não é solicitada uma senha e um usuário que recebeu o direito de executar todos os comandos sem uma senha geralmente. Presumo que este seja o comportamento desejado, já que nada em contrário foi mencionado na pergunta e a própria resposta do OP funciona da mesma maneira. Se você deseja apenas verificar o passwordless completosudo
, basta executar umsudo -k
para limpar as credenciais atuais de antemão:Agora, como @Kamil Maciorowski mencionou nos comentários, isso falhará nos casos em que o usuário possa ter recebido
sudo
acesso sem senha/usr/bin/true
especificamente. Para se proteger contra isso, você poderia fazer algo assim:Aqui, ao criar um link simbólico
/tmp/true
que aponta para/usr/bin/true
, isso funcionará mesmo se/usr/bin/true
estiver configurado para ser executado sem senhasudo
. Agora, se estamos sendo paranóicos, é teoricamente possÃvel que alguém também tenha configurado/tmp/true
para rodar com passwordlesssudo
. Para se proteger também contra esse cenário improvável, você poderia fazer:Aqui, copiamos
/usr/bin/true
(que é um pequeno arquivo de 27K no meu sistema) para o/tmp
diretório com um nome aleatório (garantido que não existe) e então fazemos a verificação com isso. Embora ainda seja teoricamente possÃvel que alguém tenha adicionado aleatoriamente essa string especÃfica asudoers
, as chances de isso acontecer são tão pequenas que acho seguro ignorá-las.Eu testei isso no BASH em algumas das principais distribuições Linux, como Debian, Redhat e Oracle Enterprise Linux 7. Esta técnica não funciona no FreeBSD ou em qualquer BSD (incluindo macOS).
Isso aproveita a
askpass
opção desudo
tentar usar outro programa para validar a senha. Ao defini-lo como/bin/false
, uma das duas respostas padrão é retornada com base no fato de o usuário poder executarsudo
comandos sem senha ou não.Casos de teste
A matriz do caso de teste é a seguinte:
Caso 1. Usuário com direitos sudo sem senha
Caso 2. Usuário com direitos sudo, mas exigindo uma senha
Caso 3. Um usuário sem direitos sudo
Se o código de retorno for 0, o usuário poderá executar
sudo
comandos sem senha, se for diferente de zero (por exemplo, 1), esse usuário não terá acesso.ps Obrigado a terdon por fornecer um ponto de partida para esta resposta: https://unix.stackexchange.com/a/692109/22709