Script Bash: Requer que o script seja executado como root (ou com o sudo)

26

Estou tentando escrever um script bash (no Ubuntu) que irá fazer backup de um diretório usando tar.

Como posso fazer uma verificação no script para que ele possa ser executado apenas como root (ou com o sudo)?

Por exemplo, se um usuário executa o script, deve-se dizer que esse script deve ser executado com privilégios de sudo e sair. Se o script for executado como root, ele continuará após a verificação.

Eu sei que tem que haver uma solução fácil, só não consegui encontrá-la pesquisando no Google.

Cory Plastek
fonte

Respostas:

37

Para obter o uid efetivo, use este comando:

id -u

Se o resultado for '0', o script está sendo executado como root ou usando o sudo. Você pode executar a verificação fazendo algo como:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi
Scott Pack
fonte
5
Eu recomendaria qualificar totalmente o caminho para o id (por exemplo, / usr / bin / id). Caso contrário, um usuário desonesto pode escrever seu próprio script / binário que sempre retorna 0 e colocá-lo em um local que existe anteriormente no caminho dos usuários em execução.
ktower
Acordado. Corrigindo com uma edição.
9788 Scott Pack
6
Qualquer pessoa 'desonesta' tentando executar o script não será interrompida por você usando o caminho completo para a identificação.
theotherreceive
Eu concordo com o outro ... é um script bash. A qualificação da lixeira 'id' não impedirá ninguém que esteja seriamente interessado em contornar a verificação de qualquer maneira. Melhor deixar não qualificado para portabilidade.
Chris
1
Isso não atende ao requisito "sudo".
GregB
17

Suponho que você saiba que, alterando a propriedade para root

chown root:root file

e definindo as permissões para 700

chmod 700 file

você realizará a mesma coisa - sem a sugestão de executar como sudo.

Mas vou postar esta resposta por completo.

Brent
fonte
3
Essa é uma solução mais apropriada do que a resposta aceita. - My $ 0,02
Chris
Nota lateral: verificar o script no git se torna mais difícil. Para corrigir,sudo git add <file>
Chaim Eliyah 30/10
2

Qual é o seu objetivo aqui, informar ao usuário que ele deve executar o script como root ou como algum tipo de precaução de segurança?

Se você deseja apenas informar o usuário de que qualquer uma das sugestões do uid é boa, mas elas são tão úteis quanto pneus a cavalo como medida de segurança - não há nada para impedir que um usuário copie o script, retire a instrução if, e executando de qualquer maneira.

Se esse for um problema de segurança, o script deverá ser definido como 700, pertencente a root: root, para que não seja legível ou executável por nenhum outro usuário.

theotherreceive
fonte
Ou, poderia ser o script requer acesso a arquivos ou comandos acessíveis apenas a raiz, a fim de realizar o seu trabalho, como no meu caso
chrisbunney
2

Você também pode usar o comando whoami.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi
Kiril
fonte
Na verdade, o uid 0 é a conta de usuário especial com privilégios totais. "raiz" é simplesmente o rótulo / nome mais comum mapeado para esse UID. Ele não precisa ser 'root' e um invasor pode tentar explorar isso.
precisa saber é o seguinte
2

A variável bash $EUIDmostra o UID efetivo em que o script está sendo executado. Se você deseja garantir que o script seja executado como root, verifique se $EUIDo valor é 0 ou não:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

Isso é melhor do que a solução com /usr/bin/id(para scripts bash!) Porque não requer um comando externo.

Neuhaus
fonte
1
Em vez de simplesmente sair, poderia solicitar ao usuário o login do sudo substituindo a echolinha por sudo "$0" "$@"e substituindo exit 2por exit $?.
precisa saber é o seguinte
Boa ideia. No entanto, a pergunta solicitou um script que encerrasse, não executasse o sudo por si só.
neuhaus
0

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

alexandre1985
fonte
-1

"#! / bin / su root" permite que os usuários no modo superusuário executem o script sem usar a senha root. Se você deseja que os superusuários executem o script com resultados como root, isso é o que ocorre.

Lynnux
fonte