Como verificar se tenho acesso ao sudo?

104

Recentemente, tive problemas por causa disso.

$sudo vim /etc/motd 
[sudo] password for bruce: 
bruce is not in the sudoers file.  This incident will be reported.

Existe uma maneira de verificar se eu tenho acesso ao sudo ou não?

Bruce
fonte
Pergunte ao administrador do sistema?
Mdpc
11
@mdpc: Existe outra maneira além disso?
18713 Bruce Bruce
Você não mencionou se pode obter acesso root ou não.
Mdpc
46
Essa deve ser a primeira instância de alguém que segue "Este incidente será relatado" .
slhck

Respostas:

121

Corra sudo -v. Geralmente é usado para estender o tempo limite da senha do sudo, mas pode ser usado para determinar se você possui algum sudoprivilégio.

$ sudo -v
Sorry, user [username] may not run sudo on [hostname].

Trecho da página de manual:

Se for dada a opção -v (validar), o sudo atualizará o registro de data e hora do usuário, solicitando a senha do usuário, se necessário. Isso prolonga o tempo limite do sudo por mais 5 minutos (ou qualquer que seja o tempo limite definido em sudoers), mas não executa um comando.

Se seu usuário tiver permissão para executar apenas comandos específicos , esse comando funcionará, indicando que você pode executar algo com privilégios diferentes. Embora a mensagem pareça diferente ao tentar executar um comando que você não tem permissão nesse caso (e nenhum email é enviado para o root ), ainda é possível que você tenha problemas se os administradores lerem /var/log/secure.

$ sudo ls
[sudo] password for [username]: 
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].

Para descobrir o que você pode executar com privilégios diferentes, você pode usar sudo -l. Observe que este comando requer que você digite sua senha.

Daniel Beck
fonte
2
Obrigado. sudo -v funciona para mim. A página de manual diz que também posso executar o sudo -l, mas isso solicita uma senha. Por que é que?
Bruce
2
@ Bruce Estou supondo aqui, mas, caso contrário, alguém (ou um programa que você executa) pode descobrir quais programas podem ser executados (possivelmente sem digitar a senha) pelo seu usuário atual e tentar usar essas informações maliciosamente.
Daniel Beck
O que você acha que significa quando eu recebo de volta patrick@<host>:~$ sudo -v sudo: unable to resolve host <host>:? Digitei minha senha e não recebi nada de não autorizado. Eu sei que tenho sudode executar com êxito outros comandos, mas essa unable to resolve hostmensagem me preocupou que outra coisa poderia ser descolada no host.
21714 Patrick M
@PatrickM Parece um problema com o sudoersarquivo. Lá você pode especificar em qual host um usuário está autorizado a executar um comando específico (isso é útil ao usar o mesmo sudoersarquivo em várias máquinas). Possivelmente, o nome do host especificado nesse arquivo não pôde ser resolvido. Tente verificá-lo com o hostcomando, por exemplo.
Ale
Não funciona para mim no RHEL 6, sudo -vdeu "xx não está no arquivo sudoers. Este incidente será relatado".
79E09796
43

Isto é muito simples. Corra sudo -l. Isso listará todos os privilégios do sudo que você tiver.

Brad Dausses
fonte
11
Talvez com votos negativos, porque repete o que Daniel Beck disse há quase dois anos.
G-Man
11
Ou explica o que acontece, é um comentário, na melhor das hipóteses
Ramhound
2
@ Jonathan: se você criar um script no ubuntu rigt agora, sudo -lsolicita uma senha se você pode sudo ou não. sudo -vpergunta apenas se você pode, e "$(whoami)" != "root"nunca perguntará nada em qualquer linux.
bksunday
@bksunday Você está correto. Eu testei agora em um Debian Jessy limpo e confirmei seus resultados. Meu comentário anterior (excluído agora) provavelmente foi o resultado de testes em uma máquina na qual eu tinha alguns sudoprivs.
Jonathan Ben-Avraham
@ G-Man, mas esta resposta simples me ajudou mais do que provavelmente a resposta mais precisa de Daniel, onde esse comando é o fim, infelizmente ...
#
11

Aqui está a versão compatível com scripts:

timeout 2 sudo id && echo Access granted || echo Access denied

pois não ficará preso na entrada da senha se você não tiver sudoacesso.

Você também pode configurá-lo em uma variável como:

timeout 2 sudo id && sudo="true" || sudo="false"
echo "$sudo"

Nota: No macOS, você precisa instalar coreutils, por exemplo brew install coreutils.

kenorb
fonte
Alguma alternativa para onde timeoutnão está disponível por padrão, por exemplo, no OS X?
Harry
11
Você precisa instalar coreutils, por exemplo brew install coreutils.
kenorb
2
Isso não funciona para mim em um script. Por razões inexplicáveis, o script trava até que eu o mate.
beruic 11/11/19
7

A resposta de Gerald Schade aqui ainda pode ser melhorada!

Usar

prompt=$(sudo -nv 2>&1)
if [ $? -eq 0 ]; then
  # exit code of sudo-command is 0
  echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
  echo "has_sudo__needs_pass"
else
  echo "no_sudo"
fi

Aqui está um exemplo completo de uso em um script :

#!/usr/bin/env bash

is_root () {
    return $(id -u)
}

has_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
    echo "has_sudo__pass_set"
    elif echo $prompt | grep -q '^sudo:'; then
    echo "has_sudo__needs_pass"
    else
    echo "no_sudo"
    fi
}

elevate_cmd () {
    local cmd=$@

    HAS_SUDO=$(has_sudo)

    case "$HAS_SUDO" in
    has_sudo__pass_set)
        sudo $cmd
        ;;
    has_sudo__needs_pass)
        echo "Please supply sudo password for the following command: sudo $cmd"
        sudo $cmd
        ;;
    *)
        echo "Please supply root password for the following command: su -c \"$cmd\""
        su -c "$cmd"
        ;;
    esac
}

if is_root; then
    echo "Error: need to call this script as a normal user, not as root!"
    exit 1
fi


elevate_cmd which adduser
ajneu
fonte
2

Para mim, ' sudo -v' e ' sudo -l' não funcionaram em um script porque às vezes são interativos (solicitando uma senha, como mencionado acima). ' sudo -n -l' também não funcionou, deu o código de saída '1', embora eu tenha permissões de sudo, devido à falta de senha. Mas estendendo o comando para:

A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor

foi bem sucedido para mim no roteiro. Essa expressão fornece 0se o usuário atual pode chamar 'sudo' e, 1se não.

Explicação:
O parâmetro adicional -npara sudoimpedir interatividade.
A saída $Ado comando ' sudo -n -v 2>&1' pode ser:
- vazia (neste caso, sudo pode ser chamado pelo usuário atual) ou:
- uma observação de que o usuário atual não está autorizado para sudo ou:
- um texto de pergunta para o senha (neste caso, o usuário está autorizado).
("asswor" serve para uma "senha" em inglês e para uma "passwort" alemã).

Gerald Schade
fonte
2

Eu tenho uma classificação baixa para votar e comentar, mas eu queria aprovar a resposta de Gerald Schade, pois descobri que era a única maneira anteriormente e pensei que ninguém mais o sabia - até agora: D

entre minha solução:

[[ "$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'* ]]

(a partir do final de 2015, mwhahaaa)

user629901
fonte
11
Leia sobre "Por que preciso de 50 reputação para comentar" para garantir que você entenda como pode começar a comentar.
Pimp Juice IT
1

O "acesso ao Sudo" vem com sabores. Dois tipos principais: Primeiro, você ou um grupo do qual é membro, precisa ser configurado para acesso ao sudo no arquivo / etc / sudoers.

Em segundo lugar, você precisa saber sua senha ou precisa ter feito um comando sudo recentemente. Recentemente, o tempo limite não expirou. (Curiosidade: você pode demorar muito tempo no arquivo do sudoer.)

Frequentemente, quero testar o segundo tipo de acesso no prólogo de um script que precisará executar algumas etapas. Quando essa verificação falha, posso aconselhar o usuário que ele precisa habilitar o segundo tipo de acesso antes de executar o script.

bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled

O -S diz ao sudo para ler a senha do stdin. O -p define um prompt vazio. O -K limpa a segunda vez de acesso.

Como ele envia o stderr para / dev / null, também verificará se o usuário tem o primeiro tipo de acesso ao sudo.

Ben Hyde
fonte
-4

Siga estas etapas para visualizar o arquivo sudoers. Se você está lá, você tem sudo. Caso contrário, você pode se adicionar.

  1. su
  2. visudo
  3. Parte inferior do arquivo, insira your_username_here ALL=(ALL) ALL
  4. Acerto ESCe tipo:wq
  5. Tipo exit
  6. Execute novamente o seu comando que necessário sudo
  7. Digite sua senha (não a senha do root)
Kruug
fonte
11
O OP "teve problemas" ao executar sudo, então provavelmente não é o administrador do sistema, nem mesmo um dos administradores de elite do sistema. Ele provavelmente é apenas um usuário que pensou que poderia ter recebido alguns poderes limitados. O que faz você suspeitar que ele pode ir su?
Scott Scott