Como um script pode verificar se está sendo executado como root?

94

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 ?

    
por Malabarba 02.12.2010 / 12:30

10 respostas

135
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi
    
por aneeshep 02.12.2010 / 12:44
106

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.

Testes

/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
    
por Lekensteyn 13.03.2011 / 10:19
30

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
    
por jfs 13.03.2011 / 11:26
19

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' ]
    
por Nathan Osman 13.03.2011 / 08:38
9
#!/bin/bash
[[ $(id -u) != 0 ]] 
echo $?
    
por João Pinto 02.12.2010 / 12:40
9

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)"))
}
    
por Luchostein 12.10.2016 / 16:14
2

Uma maneira simples de tornar o script apenas executável pelo root é iniciar o script com a linha:
#!/bin/su root

    
por alexandre1985 13.08.2016 / 23:07
1
#!/bin/bash
uid='id -u'
if [ "$uid" == "0" ]
then
    echo 1
else
    echo 0
fi
    
por Delan Azabani 02.12.2010 / 12:35
1

Este snippet seria:

  • Verifique em sessões diferentes
  • sugira usar sudo !!
  • e retornar um erro
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
    
por rubo77 16.10.2014 / 11:17
1

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 .

    
por gertas 18.10.2015 / 00:00