Aqui está a minha fonte:
#!/bin/bash
echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";
Ele limpa caches e outras coisas, e faz eco que ele precisa ser executado como root no terminal. Basicamente, só quero que o script pare de ser executado se detectar que não está sendo executado como root.
Exemplo:
"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."
Se executado com privilégios elevados, é executado normalmente. Alguma ideia? Obrigado!
shell-script
root
M. Knepper
fonte
fonte
root
por prefixac prefixo todos os comandos que devem ser executados comoroot
comsudo
.Respostas:
O usuário root possui o UID 0 (independentemente do nome da conta "root"). Se o UID efetivo retornado por
id -u
não for zero, o usuário não estará executando o script com privilégios de root. Useid -ru
para testar o ID real (o UID do usuário que está chamando o script).Não use
$EUID
no script, pois isso pode ser modificado por um usuário não privilegiado:Se um usuário fizer isso, obviamente isso não levará à escalada de privilégios, mas poderá fazer com que os comandos no script não consigam fazer o que deveriam fazer e os arquivos sejam criados com o proprietário errado etc.
fonte
/bin/id -u
dá/bin/id: illegal option -- u
Usage: id [-ap] [user]
/usr/xpg4/bin
no início$PATH
para ter acesso aos utilitários POSIX no Solaris.-u
opção deid
não é universal e, portanto, essa solução é universal somente com a ressalva de que uma versão POSIXid
deve ocorrer primeiro no seu CAMINHO.$PATH
na parte superior do script, como/usr/xpg4/bin
antes/bin
. Se você insistir em não usar o POSIXid
, obviamente terá que criar uma solução mais portátil.PATH=$( getconf PATH )
ou definir outro caminho padrão explícito ou usar um caminho explícito para chamarid
.Acho que o que você deseja é verificar se você possui privilégios de superusuário, ou seja, se seu ID de usuário efetivo é 0.
zsh
ebash
disponibilize isso na$EUID
variável, para que você possa:Com qualquer shells do tipo POSIX, você pode usar o
id
comando padrão:Note-se que todos
id -un
ouwhoami
ou a$USERNAME
variávelzsh
irá obter o primeiro nome de usuário para o uid. Em sistemas que possuem outros usuários com o ID 0, isso pode não ser oroot
mesmo se o processo for descendente de um que foi autenticado comoroot
.$USER
seria normalmente dar-lhe o usuário que autenticou, mas contando com ele é bastante frágil. Não é definido pelo shell, mas geralmente é definido pelo comando de autenticação (comologin
,su
(nos sistemas GNU / Linux, não necessariamente em outros))sudo
,sshd
(pelo menos o do openssh) ...). Nem sempre é assim (alterar o uid não define automaticamente essa variável, isso deve ser feito explicitamente pelo aplicativo que altera o uid) e também pode ter sido modificado por algum outro processo na ancestralidade do shell.$LOGNAME
, com a mesma ressalva é mais confiável, conforme especificado pelo POSIX (originalmente do FIPS 151-2)fonte
Você pode usar
$USER
ouwhoami
para verificar o usuário atual.fonte
3.2.4.2 Conditional Constructs
3.5.4 Command Substitution
id -u
com ou sem uma-n
opção é uma alternativa ao uso de whoami. Sem um -n e comparar com zero é uma melhor correspondência para o teste que o kernel está realmente fazendo. Tudo o que o kernel se importa é o ID, não o nome do arquivo de senhas.$(id -u)
é melhor. Em alguns casos (maliciosos),$USER
pode estar errado.O que você realmente deseja é determinar se você tem acesso para executar essas operações. É uma prática recomendada verificar se você está ou não raiz em vez disso.
Se o sistema foi configurado para permitir que um usuário não root modifique o swap e descarte o cache da página, por que esse usuário não deve executar seu script?
Em vez disso, você pode simplesmente tentar a operação e sair com uma mensagem útil se ela falhar:
fonte
exit
depois que algo falhar, caso o usuário queira fazer o máximo que puder com seus privilégios atuais. (. Mas para um sistema típico onde tudo isso exige raiz, saindo seria mais útil / menos ruidoso)