2013-02-18 19:36:35 +0000 2013-02-18 19:36:35 +0000
108
108

Como verificar se tenho acesso ao sudo?

Recentemente tive problemas por causa disto.

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

Existe alguma forma de verificar se tenho acesso ao sudo ou não?

Respostas (9)

123
123
123
2013-02-18 19:51:06 +0000

Run sudo -v. É normalmente usado para estender o tempo limite da sua palavra-passe sudo, mas pode ser usado para determinar se tem algum privilégio sudo.

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

Excerto da página Man:

Se for dada a opção -v (validar), o sudo irá actualizar o carimbo de tempo do utilizador, solicitando a palavra-passe do utilizador, se necessário. Isto prolonga o tempo limite do sudo por mais 5 minutos (ou qualquer que seja o tempo limite definido nos sudoers) mas não executa um comando.

Se o seu utilizador só pode executar comandos específicos, este comando irá funcionar, indicando que tem permissão para executar qualquer coisa com privilégios diferentes. Embora a mensagem pareça diferente quando tenta executar um comando que não lhe é permitido neste caso (e ** nenhum e-mail é enviado para o root** ), ainda assim é possível que 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_ lhe é permitido executar com diferentes privilégios, pode usar sudo -l. Note que este comando requer que introduza a sua palavra-passe.

43
43
43
2014-12-17 22:55:06 +0000

Isto é muito simples. Run sudo -l. Isto irá listar os privilégios do sudo que você tem.

12
12
12
2016-06-14 00:49:56 +0000

Aqui está a versão amigável ao script:

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

, uma vez que não ficará colado na entrada da senha se não tiver o acesso sudo.

Também pode configurá-lo numa variável como:

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

Nota: No macOS, precisa de instalar o coreutils, por exemplo, o brew install coreutils.

9
9
9
2017-12-30 18:57:38 +0000

Resposta de Gerald Schade aqui , ainda pode ser melhorado!

Utilização

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 utilização num 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
3
3
3
2017-02-28 02:27:06 +0000

Para mim, “sudo -v” e “sudo -l” não funcionam num guião porque por vezes são interactivos (pedindo-me uma palavra-passe, como mencionado acima). O ‘sudo -n -l’ também não funcionou, ele deu o código de saída ‘1’ embora eu tenha permissões sudo, devido à senha que faltava. Mas estender o comando para:

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

foi um sucesso para mim para o script. Esta expressão dá 0 se o utilizador actual puder chamar ‘sudo’ e 1 se não puder.

Explicação: O parâmetro adicional -n a sudo impede a interactividade.
A saída $A do comando ‘sudo -n -v 2>&1’ pode ser: - vazio (neste caso, o sudo pode ser chamado pelo utilizador actual), ou: - uma nota que o utilizador actual não está autorizado para o sudo, ou: - um texto de pergunta para a password (neste caso, o utilizador está autorizado). (“asswor” caberá para uma “password” inglesa, bem como para uma “Passwort” alemã).

2
2
2
2017-10-01 22:31:29 +0000

tenho uma baixa patente para votar e comentar, mas queria elevar a resposta de Gerald Schade, pois descobri que a única maneira anteriormente, e pensei que ninguém mais o sabe - até agora :D

btw minha solução:

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

(a partir do final de 2015 mwhaaaa)

1
1
1
2020-02-11 09:15:13 +0000

Isto deve ser suficiente para lhe dizer se tem ou não raiz:

sudo whoami

Se sudo pede a palavra-passe de raiz, ou não funciona, significa também que não tem privilégios de raiz (pelo menos não através de sudo).

1
1
1
2016-08-30 17:58:05 +0000

O “Sudo access” vem em sabores. Dois sabores primários: Primeiro você, ou um membro do seu grupo, precisa de ser configurado para acesso sudo no ficheiro /etc/sudoers.

Segundo você precisa de saber a sua senha, ou você precisa de ter feito um comando sudo recentemente. Recentemente o tempo limite ainda não expirou. (Facto engraçado: pode fazer o tempo esgotado no ficheiro do seu sudoer)

Muitas vezes quero testar para o segundo tipo de acesso no prolongamento de um script que precisará de sudoer alguns passos. Quando esta verificação falha, posso aconselhar o utilizador a activar 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 sudoer para ler a password do stdin. O -p define um prompt vazio. O -K limpa a segunda vez de acesso.

Uma vez que envia stderr para /dev/null, irá também verificar se o utilizador tem o primeiro tipo de acesso sudo.

-5
-5
-5
2013-02-18 19:41:36 +0000

Siga estes passos para ver o ficheiro dos infractores. Se você está lá dentro, você tem o sudo. Se não, pode adicionar você mesmo.

  1. su
  2. visudo
  3. No fundo do ficheiro, introduza your_username_here ALL=(ALL) ALL
  4. Clique em ESC e digite :wq
  5. Digite exit
  6. Volte a executar o comando que necessitava dos sudo
  7. Introduza a sua palavra-passe (não a palavra-passe da raiz)