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?
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?
Respostas:
Corra sudo -v
. Geralmente é usado para estender o tempo limite da senha do sudo, mas pode ser usado para determinar se você possui algum sudo
privilé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.
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 sudo
de executar com êxito outros comandos, mas essa unable to resolve host
mensagem me preocupou que outra coisa poderia ser descolada no host.
sudoers
arquivo. Lá você pode especificar em qual host um usuário está autorizado a executar um comando específico (isso é útil ao usar o mesmo sudoers
arquivo em várias máquinas). Possivelmente, o nome do host especificado nesse arquivo não pôde ser resolvido. Tente verificá-lo com o host
comando, por exemplo.
sudo -v
deu "xx não está no arquivo sudoers. Este incidente será relatado".
Isto é muito simples. Corra sudo -l
. Isso listará todos os privilégios do sudo que você tiver.
sudo -l
solicita uma senha se você pode sudo ou não. sudo -v
pergunta apenas se você pode, e "$(whoami)" != "root"
nunca perguntará nada em qualquer linux.
sudo
privs.
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 sudo
acesso.
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
.
timeout
não está disponível por padrão, por exemplo, no OS X?
coreutils
, por exemplo brew install coreutils
.
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
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 0
se o usuário atual pode chamar 'sudo' e, 1
se não.
Explicação:
O parâmetro adicional -n
para sudo
impedir interatividade.
A saída $A
do 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ã).
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)
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.
Siga estas etapas para visualizar o arquivo sudoers. Se você está lá, você tem sudo. Caso contrário, você pode se adicionar.
su
visudo
your_username_here ALL=(ALL) ALL
:wq
exit
sudo
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
?