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

27

(Originalmente publicado no Stack Overflow. Eles sugeriram que eu tente aqui. Aqui está o post original: /programming/3858208/sudo-is-there-a-command-to-check-if-i-haha -sudo-e-ou-quanto-tempo-resta )

Veja o título. Eu quero um comando que me permita consultar o sudo. Idealmente, ele retornaria sucesso se eu ainda tiver sudo e false se o sudo tiver expirado. Obter o tempo restante também pode ser útil (embora, se eu estivesse preocupado, pudesse executar o sudo -v para revalidar.) Ah, e não deveria ser necessário solicitar uma senha.

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

Pelo que vale a pena, estou fazendo isso para que eu possa receber minha solicitação para indicar o status do sudo. Eu gosto de saber quais terminais estão ativamente sudo-capazes. Também tenho um prompt que muda de cor quando sou root, mas não o uso com muita frequência, por isso é de uso limitado.

valadil
fonte

Respostas:

10

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

8BitsOfGeek
fonte
1
+1 para as ramificações de segurança de um indicador visual!
Pausado até novo aviso.
Essa parte não tinha me ocorrido. O que eu espero que o indicador faça é lembrar-me de executar o sudo -K, em vez de esquecer que deixei o sudo ativo e deixei alguns terminais potencialmente perigosos abertos. Não que eu frequentemente esqueça de bloquear minha tela, mas eu gosto do seguro extra.
valadil
No momento, estou inclinado a verificar o sudo -V e, se for suficientemente novo para ter -n, marque -n para obter a notificação. Parece que não deve quebrar nada em lugar nenhum.
valadil
@valadil: Ocorre-me que um indicador sutil não apresentaria muitos riscos à segurança. Ative o sublinhado do nome de usuário no prompt, por exemplo.
Pausado até novo aviso.
@ Dennis: Exatamente. Eu não mudaria meu prompt para "OMG_YOU_HAVE_SUDO_NOW! _User @ host" ou algo assim. Eu provavelmente mudaria um pouco a cor. Não espero que ninguém saiba o que isso significa, a menos que se sente e fique íntimo do meu .bashrc.
valadil
29

Eu sei que essa é uma pergunta muito antiga, mas aqui estou eu em um script hoje:

CAN_I_RUN_SUDO = $ (tempo de atividade sudo -n 2> & 1 | grep "load" | wc -l)
se [$ {CAN_I_RUN_SUDO} -gt 0]
então
    eco "Eu posso executar o comando sudo"
outro
    eco "Não consigo executar o comando Sudo"
fi
wags007
fonte
1

O comando abaixo mostrará uma indicação colorida que você concedeu ao sudo, então lembre-se de fazer um sudo -kantes de sair da máquina. É útil também em terminais não coloridos.

Como podemos ter o sudo ativo e inativo em diferentes sessões de terminal, eu criei isso para você 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 tipo de terminal bashpara testá-lo. Ele também adicionará uma linha inteira toda vez que você executar um comando, com as informações da hora em que o último comando terminou, para que você possa almoçar e saber quando o último comando terminou :).

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

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

Aquarius Power
fonte
Verificar o código de saída sudo -nnão parece trabalho no OS X. Veja a minha pergunta aqui: superuser.com/questions/902826/...
nwinkler
bem, o teste que proponho é sudo -n: você acredita que poderia haver outro teste que pudesse ser usado para determinar se o usuário tem acesso ao sudo ativo? ou talvez o OS-X exija alguma atualização? Eu nunca usei o OS-X btw.
Potência de Aquário
2
Estou usando a versão mais recente do OS X. É possível que sudo -nno BSD (no qual o OS X se baseia) tenha um comportamento diferente da versão do GNU. Acabei de adicionar meu comentário para que as pessoas saibam que esta versão da verificação não parece funcionar no OS X. Eu usei uma verificação de outra resposta ( sudo -n uptime 2>&1|grep "load"|wc -l) e isso parece funcionar bem no OS X. Não é tão elegante, mas funciona.
N
1
@nwinkler oh, para que ele realmente depende da saída que gera (não o valor de retorno), interessante solução alternativa
Aquarius Poder
@nwinkler, mas é o mais próximo possível. Ou ainda melhor, porque sudo -nse torna buggy sudo -V 1.7.9
Marco M. von Hagen
1

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 https://www.sudo.ws/man/1.8.15/sudoers.man.html sua configuração defaults mail_badpass, será enviado um email para cada teste que resultar em falso (teria solicitado). Para evitar esse incômodo, altere a parte do arquivo de sudoers para

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

Como resultado, os e-mails de alerta de segurança são enviados para todos os comandos, exceto / bin / true. Bem, sim, agora alguém poderia tentar forçar brutalmente uma senha chamando sudo trueum número ilimitado de vezes sem que nenhum email de alerta de segurança fosse enviado.

Nota: Sempre use em visudovez do seu editor favorito para editar o arquivo sudoers. Caso contrário, você corre o risco de ser bloqueado.

Uwe Geuder
fonte
0

De acordo com o manual do sudo, a sessão do sudo é determinada de acordo com o arquivo de carimbo de data / hora ( /usr/lib/sudo/<username>), para que você possa descobrir quanto tempo resta verificando a data / hora do arquivo de carimbo de 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 enigmático (e também alguns /usr/lib/sudo/<username>registros de data e hora estranhos, mas parecia ter um registro de data e hora que coincidia com o horário em que forneci minha senha ao sudo Acho que /usr/lib/sudo/<username>/0tem o carimbo de hora da sudoexecução mais recente .

Dysaster
fonte
1
No meu sistema, os arquivos de registro de data e hora estão em um diretório que não pode ser lido sem o uso do sudo, que solicita uma senha e, portanto, não funciona para as necessidades do OP.
Pausado até novo aviso.
Bom ponto. Não verifiquei a propriedade desses arquivos. Você está certo, seria inútil.
Dysaster 4/10/10
0

Atenção

De acordo com o Bugzilla sudo Bug ID = 590, a chamada sudo -n true 2&>/dev/null ; echo $?se tornará bugs por aísudo -V 1.7.10

Leia o Bugzilla [aqui] ( http://bugzilla.sudo.ws/show_bug.cgi?id=590 "Bug ID = 590")

Marco M. von Hagen
fonte
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
fxlv
fonte
0

Provavelmente, esse é um exagero extremo para o padrão da maioria das pessoas, mas aqui está a função (posixly correta) que eu uso para verificar se sudoestá desbloqueada (a função não perderá tempo se o usuário estiver executando root, pois 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
Harold Fischer
fonte
-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
danday74
fonte
Isto irá solicitar uma senha, se o usuário ainda não tiver uma sessão sudo ativa
Slizzered
-2

E a página do manual

man sudo

Liste seus comandos disponíveis:

sudo -l

O próprio sudo não tem limites de data ou hora ... veja:

man sudo
man sudoers
Andreas Rehm
fonte
sudo -l me fornece um prompt de senha. Preciso que ele me diga que não tenho uma sessão sudo ativa.
valadil
O status do sudo atinge o tempo limite, mas você está correto se quer dizer que ele não possui um recurso de agendamento.
Pausado até novo aviso.
Sim - atinge o tempo limite - mas não há cronograma.
Andreas Rehm