Sudo - existe um comando para verificar se tenho sudo e / ou quanto tempo falta?

24

(Originalmente publicado no Stack Overflow. Eles sugeriram que eu tentasse aqui. Veja a postagem original: link )

Veja o título. Eu quero um comando que me permita consultar o sudo. Idealmente, ele retornaria sucesso se eu ainda tivesse sudo e falso se o sudo expirasse. Obtendo o tempo restante também pode ser útil (embora se eu estivesse preocupado, eu poderia apenas fazer o sudo -v para revalidar). Ah, e ele não deveria ter que pedir uma senha.

A coisa mais próxima que eu encontrei é "sudo -n true", mas a opção -n está presente apenas na minha máquina Centos 5 no trabalho. -n falha se tiver que pedir uma senha. Existe alguma outra maneira de obter essa funcionalidade? Suponha que eu não tenha raiz em todas as máquinas com as quais trabalho, por isso não posso instalar novas versões do sudo ao meu gosto.

Por que vale a pena estou fazendo isso para que eu possa obter o meu prompt para indicar o status sudo. Eu gosto de saber quais terminais são ativamente sudo-capazes. Eu também tenho um prompt que muda de cor quando eu sou root, mas eu não uso root muito frequentemente, então isso é de uso limitado.

    
por valadil 04.10.2010 / 21:22

10 respostas

10

A opção -n está disponível em versões mais recentes do sudo, mas como você afirmou, essa não é uma opção. Não há nenhuma maneira real de fazer o que você está procurando apenas tentando sudo e ver se ele volta com uma solicitação de senha. Se a sua preocupação é que você quer uma indicação visual, por que não iniciar o sudo / bin / bash para iniciar uma sessão de bash? Note que isso é inseguro, mas também é um pouco inseguro se alguém percebe suas mudanças imediatas no sudo.

    
por 04.10.2010 / 21:45
28

Eu sei que esta é uma pergunta muito antiga, mas aqui está um roteiro hoje:

CAN_I_RUN_SUDO=$(sudo -n uptime 2>&1|grep "load"|wc -l)
if [ ${CAN_I_RUN_SUDO} -gt 0 ]
then
    echo "I can run the sudo command"
else
    echo "I can't run the Sudo command"
fi
    
por 11.10.2012 / 17:41
1

O comando abaixo mostrará uma indicação colorida de que você tem sudo concedido, então lembre-se de fazer um sudo -k antes de sair da máquina. Também é útil em terminais não coloridos.

Como podemos ter o sudo ativo e inativo em diferentes sessões de terminal, criei isso que você pode colocar no final do seu ~ / .bashrc

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn='if(($?==0));then echo true; else echo false; fi'

    history -a; # append to history at each command issued!!!
    local width='tput cols';
    local half=$((width/2))
    local dt="[EndAt:'date +"%Y/%m/%d-%H:%M:%S.%N"']";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output='printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';'

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

No terminal, digite bash para testá-lo. Ele também adicionará uma linha inteira toda vez que você executar um comando, que tenha as informações da hora em que o último comando terminou, para que você possa ir almoçar e saber quando o último comando terminou:).

Você pode jogar com este código para atender às suas necessidades. Existe também a variável PS1 (que é a pequena linha única de prompt), mas acho melhor não mexer nela.

PS .: para o OS-X, procure o comentário abaixo por @nwinkler.

    
por 26.04.2013 / 05:58
0

De acordo com o manual do sudo, a sessão sudo é determinada de acordo com o arquivo de registro de data e hora ( /usr/lib/sudo/<username> ), portanto você pode descobrir quanto tempo resta marcando a data / hora do arquivo de registro de data e hora . No entanto, no meu sistema, o arquivo de registro de data e hora é, de fato, um diretório, e há três arquivos com conteúdo criptográfico neles (e também alguns timestamps estranhos, mas /usr/lib/sudo/<username> parecia ter um timestamp que coincidiu com o tempo que dei sudo minha senha.Eu acho que /usr/lib/sudo/<username>/0 tem a data e hora da execução mais recente do sudo .

    
por 04.10.2010 / 22:50
0

Aviso

De acordo com o Bugzilla sudo Bug ID = 590, a chamada para sudo -n true 2&>/dev/null ; echo $? ficará com bugs em torno de sudo -V 1.7.10

Leia o Bugzilla [aqui] ( link "ID do erro = 590")

    
por 11.06.2015 / 23:57
0

Para simplificar a resposta dada por @ wags007

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

No entanto, se em sua configuração link você tiver defaults mail_badpass , haverá um email enviado para cada teste que resulta em falso (teria solicitado). Para evitar esse incômodo, altere essa parte do seu arquivo sudoers para

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Como resultado, as mensagens de alerta de segurança são enviadas para todos os comandos, exceto / bin / true. Bem, sim, alguém poderia agora tentar forçar uma senha chamando sudo true um número ilimitado de vezes sem enviar nenhum email de alerta de segurança.

Nota: use sempre visudo em vez do seu editor favorito para editar o arquivo sudoers. Se você não fizer isso, corre o risco de ser bloqueado.

    
por 23.03.2018 / 13:56
0

Pelo menos no sudo 1.8.21p2, essa abordagem funciona bem:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi
    
por 16.07.2018 / 19:06
0

Isso é provavelmente um exagero extremo do padrão da maioria das pessoas, mas aqui está a função (posixly correta) que uso para verificar se sudo está desbloqueado (a função não perderá tempo se o usuário que estiver executando for root , como não há necessidade de desbloquear sudo ):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo
    
por 27.07.2018 / 04:12
-1

resposta simples ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0
    
por 25.09.2014 / 10:41
-2

Que tal a página man

man sudo

Relacione seus comandos disponíveis:

sudo -l

O próprio sudo não tem limite de tempo ou data ... veja:

man sudo
man sudoers
    
por 04.10.2010 / 21:29

Tags