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.

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

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.


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.


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

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.


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


-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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.