Estou escrevendo um script que requer permissões de nível raiz e quero fazê-lo para que, se o script não for executado como root, ele simplesmente ecoará "Por favor, execute como root". e sai.
Aqui estão alguns pseudocódigo para o que estou procurando:
if (whoami != root)
then echo "Please run as root"
else (do stuff)
fi
exit
Como eu poderia (melhor e com segurança) conseguir isso? Obrigado!
Ah, só para esclarecer: a parte (do stuff) envolveria a execução de comandos que, por si só, exigem raiz. Portanto, executá-lo como um usuário normal apresentaria um erro. Isso serve apenas para executar corretamente um script que requer comandos root, sem usar o sudo dentro do script, estou apenas procurando por algum açúcar sintático.
id -u
retorne0
para o root.Respostas:
A variável de ambiente $ EUID mantém o UID do usuário atual. O UID da raiz é 0. Use algo como isto em seu script:
Nota: Se você conseguir
2: [: Illegal number:
verificar se está#!/bin/sh
no topo e altere para#!/bin/bash
.fonte
2: [: Illegal number:
aviso até mudar para a versão do Sergio.then
é na mesma linha como a condição ...Em um script bash, você tem várias maneiras de verificar se o usuário em execução é root.
Como aviso , não verifique se um usuário é root usando o
root
nome de usuário. Nada garante que o usuário com o ID 0 seja chamadoroot
. É uma convenção muito forte que é amplamente seguida, mas qualquer um poderia renomear o superusuário com outro nome.Eu acho que a melhor maneira de usar o bash é usar
$EUID
, na página de manual:Essa é uma maneira melhor do
$UID
que a que poderia ser alterada e não refletir o usuário real executando o script.Uma maneira de abordar esse tipo de problema é injetando
sudo
meus comandos quando não é executado como root. Aqui está um exemplo:Dessa maneira, meu comando é executado pela raiz ao usar o superusuário ou
sudo
por um usuário comum.Se seu script sempre deve ser executado pela raiz, simplesmente defina os direitos adequadamente (
0500
).fonte
printf $EUID
com ou sem sudo, recebo meu próprio UID de volta. Se eu usoid -u
, recebo meu UID e, quando o invoco com sudo, recebo 0 de volta. Fiz algo de errado?sudo bash <<<'echo $EUID'
combash <<<'echo $EUID'
. Mais sobre a herestroc como herestroc em tldp.org/LDP/abs/html/x17837.htmlAlgumas respostas foram dadas, mas parece que o melhor método é usar é:
id -u
Isso parece ser mais confiável que os outros métodos e parece que ele retorna um ID igual a 0, mesmo que o script seja executado
sudo
.fonte
ou
:)
fonte
sudo
, posso simplesmente digitarsudo !!
e ele faz o trabalho para mim, em vez de pressionar a seta PARA CIMA, indo para o início da linha e adicionandosudo
à mão. Não tenho certeza se isso é uma coisa BASH ou uma coisa SUDO ou outra, mas funciona na maioria das vezes.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. Felicidades.Como @wrikken mencionado em seus comentários,
id -u
é uma verificação muito melhor para o root.Além disso, com o uso adequado de
sudo
, você pode fazer com que o script verifique e veja se está sendo executado como root. Caso contrário, faça com que ele se lembre viasudo
e execute com permissões de root.Dependendo do que o script faz, outra opção pode ser configurar uma
sudo
entrada para quaisquer comandos especializados que o script possa precisar.fonte
$0
o nome do script em execução. Existem alguns exemplos aqui que podem ajudá-lo.Há uma verificação simples para um usuário ser root.
A
[[ stuff ]]
sintaxe é a maneira padrão de executar uma verificação no bash.Isso também pressupõe que você deseja sair com 1 se falhar. A
error
função é um talento que define o texto de saída para vermelho (não necessário, mas bastante elegante, se você me perguntar).fonte
error
comando? Meu sistema parece não ter. . .less
ou outros enfeites); e (4) definir uma cor de fundo, para que o texto seja legível, independentemente da cor de fundo do terminal do usuário. Então, algo comofunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Emenda como desejado.)Maneira muito simples, basta colocar:
O benefício de usar isso em vez de
id
é que você pode verificar se um determinado usuário não raiz também está executando o comando; por exemplo.fonte
whoami
vez de usarid
; owhoami
comando também pode ser usado para procurar outros usuários que não sejam root, por nome.0- Leia a documentação oficial do GNU Linux, existem várias maneiras de fazê-lo corretamente.
1- certifique-se de colocar a assinatura do shell para evitar erros de interpretação:
2- este é o meu roteiro
fonte
Nesta resposta, fique claro, presumo que o leitor é capaz de ler
bash
e scripts shell POSIX comodash
.Acredito que não há muito o que explicar aqui, já que as respostas altamente votadas fazem um bom trabalho ao explicar grande parte delas.
No entanto, se houver algo a explicar mais, não hesite em comentar, farei o meu melhor preenchendo as lacunas.
Polivalente otimizado (não apenas
Solução ) para desempenho e confiabilidade; todas as conchas compatíveisbash
Nova solução:
Referência (salvar em arquivo
is_user_root__benchmark
)Solução original:
^^^ A solução riscada foi comprovada para não acelerar as coisas, mas existe há muito tempo, então vou mantê-la aqui pelo tempo que achar necessário.
Explicação
Como é muito mais rápido ler a variável
$EUID
padrãobash
, o número de ID do usuário efetivo, do que executar oid -u
comando para POSIX - apenas encontrar o ID do usuário, esta solução combina ambos em uma função bem compactada. Se, e somente se,$EUID
por algum motivo não estiver disponível, oid -u
comando será executado, garantindo que obtemos o valor de retorno adequado, independentemente das circunstâncias .Por que postei esta solução após tantos anos que o OP perguntou
Bem, se eu entendi corretamente, parece haver um pedaço de código ausente acima.
Veja bem, existem muitas variáveis que precisam ser levadas em consideração, e uma delas é combinar desempenho e confiabilidade .
Solução portátil POSIX + Exemplo de uso da função acima
Conclusão
Por mais que você não goste, o ambiente Unix / Linux se diversificou bastante. Ou seja, existem pessoas que gostam
bash
tanto, que nem pensam em portabilidade ( cartuchos POSIX ). Outros como eu preferem as conchas POSIX . Hoje em dia é uma questão de escolha e necessidades pessoais.fonte
Se o script realmente requer acesso root, suas permissões de arquivo devem refletir isso. Ter um script raiz executável por usuários não raiz seria uma bandeira vermelha. Convido você a não controlar o acesso com um
if
cheque.fonte
777
bomba torna essa verificação um pouco defeituosa para o tipo de usuário que cometeria o erro.bash /path/to/script
ele ainda pode ser executado mesmo queo=r
Uma maneira simples de tornar o script apenas executável pela raiz é iniciar o script com a linha:
#!/bin/su root
fonte
exit
? E essas respostas ainda estão sendo votadas? Acho que as pessoas implicitamente não querem que o script seja executado como root. Então, eu estou seguindo essa maneira de pensar, com uma resposta mais simples. Mas sim, você também pode aprender com o mais detalhado respostas acimatente o seguinte código:
OU
fonte
Tanto quanto eu sei a maneira correta de verificar é:
Consulte a seção "Teste de raiz" aqui:
http://linuxcommand.org/lc3_wss0080.php
fonte
= "0"
por-eq 0
id -u
é muito melhor do quewhoami
, já que alguns sistemas como o Android podem não fornecer a palavra raiz.Exemplo:
fonte
Nota do editor: Se você não precisar de colchetes duplos, use um para a portabilidade do código.
fonte
Verifique se você é root e saia se não for:
Ou, neste exemplo, tente criar um diretório no local raiz e tente depois que os direitos forem elevados.
Verifique se você é root e, caso contrário, eleve, se possível:
fonte
Verifique a raiz:
Testado e executando na raiz.
fonte