Estou escrevendo um script bash simples, mas preciso verificar se está sendo executado como root ou não. Sei que provavelmente existe uma maneira muito simples de fazer isso, mas não faço ideia de como.
Só para esclarecer:
Qual é uma maneira simples de escrever um script foo.sh , para que o comando seja ./foo.sh
exibido 0
e o comando seja sudo ./foo.sh
exibido 1
?
$UID
e$EUID
são bashisms. Os shells meramente compatíveis com POSIX não têm essas variáveis e você precisa usá-losid(1)
.if ((EUID)); then
, consulte o comentário de @ geirhasudo
. Se você executarsudo sh -c 'echo $EUID'
, verá os resultados esperados.$EUID
é um Bashism (como mencionado acima por @DavidFoerster), e seu/bin/sh
provavelmente é um link para/bin/dash
, não/bin/bash
.sudo bash -c 'echo $EUID'
produzirá o resultado esperado.Um usuário root não precisa ser nomeado "root".
whoami
retorna o primeiro nome de usuário com o ID do usuário0
.$USER
contém o nome do usuário conectado, que pode ter um ID de usuário0
, mas um nome diferente.O único programa confiável para verificar se a conta está logada como root ou não:
Eu uso
-u
para o ID do usuário efetivo , não-r
para o ID do usuário real . As permissões são determinadas pelo ID do usuário efetivo , não o real .Testes
/etc/passwd
contém os seguintes nomes de usuário com o ID do usuário0
na ordem especificada:Conectado como
root2
, fornece os próximos resultados:whoami
:rootx
echo $USER
:root2
(isso retorna uma string vazia se o programa foi iniciado em um ambiente vazio, por exemploenv -i sh -c 'echo $USER'
)id -u
:0
Como você pode ver, os outros programas falharam nessa verificação, somente foramid -u
aprovados.O script atualizado ficaria assim:
fonte
id -u
do bash askubuntu.com/questions/30148/…sh
(dash
) como intérprete em vez debash
. Mas bom tiro, salva outra bifurcação :)[ -w / ]
. A ideia permanece a mesma. Nota: em certos chroots,[ -w /etc/shadow ]
falhará porque/etc/shadow
é inexistente; portanto, a abordagem com/
é preferida. Uma maneira melhor seria verificar a necessidade real de permissões de root. Se o script precisar gravar/etc/someconfig
, verifique se esse arquivo é gravável OU se o arquivo não existe e/etc
é gravável.Como o @Lekensteyn disse, você deve usar um ID de usuário eficaz. Você não precisa ligar
id -u
no bash:A sugestão de @ geirha dos comentários usa avaliação aritmética:
fonte
((..))
para os números de teste, e[[..]]
para testar cordas e arquivos, assim que eu fariaif (( EUID != 0 )); then
em vez disso, ou apenasif ((EUID)); then
EUID
deve se tornar$EUID
. Em vez de usar(( $EUID != 0 ))
, use[ $EUID != 0 ]
. Também funcionarádash
.EUID
funciona muito bem. A pergunta está marcada comobash
nãodash
. O comandoenv -i sh -c '[ $EUID != 0 ]'
falha, masenv -i bash -c '(( EUID != 0 ))'
funciona. btw,dash
não funciona para alguns caracteres não-ascii no Ubuntu stackoverflow.com/questions/5160125/… É 2011 e há pessoas que usam outros idiomas.$EUID
coisas deste ponto em diante. Alterei a resposta aceita como resultado.Você pode fazer isso usando o
whoami
comando, que retorna o usuário atual:A execução do procedimento acima será impresso
You must be root to do this.
se o usuário atual não estiverroot
.Nota: uma alternativa em alguns casos é simplesmente verificar a
$USER
variável:fonte
$USER
, especialmente dessa maneira.$USER
é definido pelo shell de login, não é necessário propagar para o programa (env -i sh -c 'echo $USER'
). Dessa forma,$USER
está vazio e ocorre um erro de sintaxe.$USER
definido pelo shell, mas também é algo fácil de falsificar. Whoami retornará o usuário real.$USER
é interpretado pelo seu shell, seu exemplo deve sersudo sh -c 'echo $USER'
para ser significativo. @George: faz a suposição errada de quewhoami
sempre retornarároot
para UID 0.Levando em consideração a eficiência, você pode testar primeiro a
EUID
variável de ambiente e, se não existir, chamar oid
comando padrão :Dessa forma, devido ao atalho OU , você evita chamar um comando do sistema, priorizando a consulta de uma variável na memória.
Reutilização de código:
fonte
id -u
. Veja o script do banco, juntamente com os resultados abaixo, aqui: pastebin.com/srC3LWQyfonte
Uma maneira simples de tornar o script apenas executável pela raiz é iniciar o script com a linha:
#!/bin/su root
fonte
fonte
Esse trecho:
sudo !!
fonte
Esta resposta é apenas para salvar uma ideia, pode ser útil para alguns de vocês. Se você precisar de um script que seja executado na GUI da área de trabalho e exija privilégios de root, tente desta maneira:
Dessa forma, você terá uma boa janela de diálogo solicitando a senha do usuário root. Assim como no sudo da linha de comando.
A
gksudo
podem não estar disponíveis em seu sistema, em seguida, instalá-lo comsudo apt-get install gksu
.fonte
Esse código funciona tanto no Bash quanto no Bourne sh de ações (testado no FreeBSD) que não define o EUID. Se existir EUID, seu valor será retornado, caso contrário, o comando 'id' será executado. É um pouco mais curto que o exemplo "ou" acima, pois usa um shell ": -" embutido.
Raiz em sh:
fonte