Como verificar se tenho acesso ao sudo?

93

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 tenho acesso ao sudo ou não?

    
por Bruce 18.02.2013 / 20:36

8 respostas

115

Execute sudo -v . Ele é geralmente usado para estender o tempo limite da senha sudo, mas pode ser usado para determinar se você tem privilégios sudo .

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

Trecho da página do manual:

If given the -v (validate) option, sudo will update the user’s time stamp, prompting for the user’s password if necessary. This extends the sudo timeout for another 5 minutes (or whatever the timeout is set to in sudoers) but does not run a command.

Se o seu usuário só puder executar comandos específicos , este comando funcionará, indicando que você tem permissão para executar algo com privilégios diferentes. Embora a mensagem pareça diferente ao tentar executar um comando que você não tem permissão para fazer neste 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ê tem permissão para executar com privilégios diferentes, você pode usar sudo -l . Note que este comando requer que você digite sua senha.

    
por 18.02.2013 / 20:51
41

Isso é muito simples. Execute sudo -l . Isto irá listar quaisquer privilégios de sudo que você tenha.

    
por 17.12.2014 / 23:55
8

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

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

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

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

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

Observação: no macOS, você precisa instalar o coreutils , por exemplo, brew install coreutils .

    
por 14.06.2016 / 02:49
3

A resposta de Gerald Schade aqui , ainda pode ser melhorada!

Use

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
    
por 30.12.2017 / 19:57
1

Para mim, ' sudo -v ' e ' sudo -l ' não funcionaram em um script porque, às vezes, são interativos (pedindo uma senha, como mencionado acima). ' sudo -n -l ' também não funcionou, ele deu o código de saída '1', embora eu tenha permissões sudo, por causa da senha ausente. 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. Esta expressão fornece 0 se o usuário atual puder chamar 'sudo' e 1 , se não.

Explicação:
O parâmetro adicional -n to sudo impede a interatividade.
A saída $A do comando ' sudo -n -v 2>&1 ' pode ser:
 - vazio (neste caso, o sudo pode ser chamado pelo usuário atual) ou:
 - uma nota que o usuário atual não está autorizado para sudo, ou:
 - um texto de pergunta para a senha (neste caso, o usuário está autorizado).
("asswor" caberá para uma "senha" em inglês, assim como para uma "Senha" em alemão).

    
por 28.02.2017 / 03:27
1

Eu tenho baixa classificação para votar e comentar, mas eu queria vingar a resposta de Gerald Schade, como eu descobri que a única maneira anterior, e pensei que ninguém mais sabe - até agora: D

entre minha solução:

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

(do fim de 2015 mwhahaaa)

    
por 02.10.2017 / 00:31
1

"Acesso ao Sudo" vem em sabores. Dois tipos principais: Primeiro você, ou um grupo seu membro, precisa ser configurado para acesso sudo no arquivo / etc / sudoers.

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

Muitas vezes, quero testar o segundo tipo de acesso no prólogo de um script que precisará executar alguns passos. Quando esta verificação falha, posso avisar ao usuário que ele precisa ativar 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 envia stderr para / dev / null, ele também verifica se o usuário tem o primeiro tipo de acesso sudo.

    
por 30.08.2016 / 19:58
-3

Siga as estas etapas para visualizar o arquivo sudoers. Se você está lá, você tem sudo. Se não, você pode se adicionar.

  1. su
  2. visudo
  3. Parte inferior do arquivo, insira your_username_here ALL=(ALL) ALL
  4. Pressione ESC e digite :wq
  5. Digite exit
  6. Execute novamente seu comando que precisava de sudo
  7. Digite sua senha (não a senha da raiz)
por 18.02.2013 / 20:41