#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
Estou escrevendo um script simples, mas preciso verificar se ele está sendo executado como root ou não. Eu sei que há provavelmente uma maneira muito simples de fazer isso, mas não tenho ideia de como.
Só para ficar claro:
O que é uma maneira simples de escrever um script foo.sh , para que o comando ./foo.sh
outputs 0
e o comando sudo ./foo.sh
outputs 1
?
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
Um usuário root não precisa ser chamado de "root". whoami
retorna o primeiro nome de usuário com o ID de usuário 0
. $USER
contém o nome do usuário conectado, que pode ter o ID de usuário 0
, mas tem um nome diferente.
O único programa confiável para verificar se a conta está logada como root, ou não:
id -u
Eu uso -u
para o ID do usuário efetivo -r para o ID do usuário real . As permissões são determinadas pelo ID de usuário efetivo real um.
/etc/passwd
contém os seguintes nomes de usuários com o ID de usuário 0
na ordem indicada:
rootx
root2
Conectado como root2
, apresenta os próximos resultados:
whoami
: rootx
echo $USER
: root2
(isso retorna uma string vazia se o programa foi iniciado em um ambiente vazio, por exemplo, env -i sh -c 'echo $USER'
) id -u
: 0
Como você pode ver, os outros programas falharam nessa verificação, apenas id -u
passou. O script atualizado ficaria assim:
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
echo "I am not root!"
exit 1
fi
Como @Lekensteyn disse que você deveria usar um ID de usuário efetivo. Você não precisa chamar id -u
no bash:
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "You must be root to do this." 1>&2
exit 100
fi
@ A sugestão de geirha dos comentários usa avaliação aritmética:
#!/bin/bash
if (( EUID != 0 )); then
echo "You must be root to do this." 1>&2
exit 100
fi
Você pode fazer isso usando o comando whoami
, que retorna o usuário atual:
#!/bin/bash
if [ 'whoami' != 'root' ]
then
echo "You must be root to do this."
exit
fi
...
A execução acima irá imprimir You must be root to do this.
se o usuário atual não for root
.
Observação: uma alternativa em alguns casos é simplesmente verificar a variável $USER
:
if [ $USER != 'root' ]
#!/bin/bash
[[ $(id -u) != 0 ]]
echo $?
Considerando a eficiência, você pode testar, primeiro, a variável de ambiente EUID
e, se ela não existir, chamar o comando padrão id
:
if ((${EUID:-0} || "$(id -u)")); then
echo You are not root.
else
echo Hello, root.
fi
Desta forma, por causa do atalho OR , você evita chamar um comando do sistema, priorizando a consulta de uma variável na memória.
Reutilização de código:
function amIRoot() {
! ((${EUID:-0} || "$(id -u)"))
}
Uma maneira simples de tornar o script apenas executável pelo root é iniciar o script com a linha:
#!/bin/su root
#!/bin/bash
uid='id -u'
if [ "$uid" == "0" ]
then
echo 1
else
echo 0
fi
Este snippet seria:
sudo !!
if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ] then echo "You must be root to run this script!" echo "use 'sudo !!'" exit 1 fi
Esta resposta é apenas para salvar uma ideia e pode ser útil para alguns de vocês. Se você precisar de script que é executado a partir da GUI da área de trabalho e requer privilégios de root, tente desta forma:
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
gksudo -w $0 $@
exit
fi
#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave
Desta forma, você terá uma boa janela de diálogo solicitando a senha do usuário root. Assim como com sudo de linha de comando.
O gksudo
pode não estar disponível em seu sistema e, em seguida, instalá-lo com sudo apt-get install gksu
.