Voici ma source:
#!/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 "";
Il efface les caches et les trucs, et il fait écho qu'il doit être exécuté en tant que root dans le terminal. Je veux simplement que le script cesse de fonctionner s'il détecte qu'il n'est pas exécuté en tant que root.
Exemple:
"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..."
S'il est exécuté avec des privilèges élevés, il fonctionne comme d'habitude. Des idées? Merci!
shell-script
root
M. Knepper
la source
la source
root
en préfixant préfixer toutes les commandes qui doivent s'exécuter commeroot
avecsudo
.Réponses:
L'utilisateur root a l'UID 0 (quel que soit le nom du compte "root"). Si l'UID effectif renvoyé par
id -u
n'est pas nul, l'utilisateur n'exécute pas le script avec les privilèges root. Utilisezid -ru
pour tester par rapport à l'ID réel (l'UID de l'utilisateur invoquant le script).Ne pas utiliser
$EUID
dans le script car cela peut être modifié par un utilisateur non privilégié:Si un utilisateur faisait cela, cela n'entraînerait évidemment pas une escalade de privilèges, mais pourrait conduire à ce que les commandes du script ne puissent pas faire ce qu'elles sont censées faire et que les fichiers soient créés avec le mauvais propriétaire, etc.
la source
/bin/id -u
donne/bin/id: illegal option -- u
Usage: id [-ap] [user]
/usr/xpg4/bin
début de votre$PATH
accès aux utilitaires POSIX sur Solaris.-u
option deid
n'est pas universelle et par conséquent, cette solution n'est universelle qu'avec la mise en garde qu'une version POSIXid
doit apparaître en premier dans votre PATH.$PATH
le en haut du script pour que ce/usr/xpg4/bin
soit avant/bin
. Si vous insistez pour utiliser non-POSIXid
, alors vous devrez évidemment trouver une solution plus portable.PATH=$( getconf PATH )
ou définir un autre chemin par défaut explicite, ou utiliser un chemin explicite pour appelerid
.Je pense que ce que vous voulez, c'est plutôt de vérifier que vous avez des privilèges de super-utilisateur, c'est-à-dire que votre ID utilisateur effectif est 0.
zsh
et lebash
rendre disponible dans la$EUID
variable, afin que vous puissiez faire:Avec tous les shells de type POSIX, vous pouvez utiliser la
id
commande standard:Notez que tout
id -un
ouwhoami
ou la$USERNAME
variable danszsh
vous obtiendrez le premier nom d'utilisateur pour l'uid. Sur les systèmes qui ont d'autres utilisateurs avec l'ID 0, cela peut ne pas être leroot
cas même si le processus est un descendant de celui qui a été authentifié en tant queroot
.$USER
serait généralement vous donner à l'utilisateur qui a authentifié, mais compter sur elle est très fragile. Il est pas défini par le shell, mais est généralement définie par la commande d'authentification (commelogin
,su
(sur les systèmes GNU / Linux, pas nécessairement d' autres),sudo
,sshd
(celui de OpenSSH au moins) ...). Ce n'est pas toujours le cas (le changement de l'uid ne définit pas automatiquement cette variable, cela doit être fait explicitement par l'application qui change l'uid) et il pourrait également avoir été modifié par un autre processus dans l'ascendance du shell.$LOGNAME
, avec la même mise en garde est plus fiable que spécifié par POSIX (à l'origine de FIPS 151-2)la source
Vous pouvez utiliser
$USER
ouwhoami
pour vérifier l'utilisateur actuel.la source
3.2.4.2 Conditional Constructs
3.5.4 Command Substitution
id -u
avec ou sans-n
option est une alternative à l'utilisation de whoami. Sans -n et la comparaison avec zéro est une meilleure correspondance avec le test que le noyau est en train de faire. Tout le noyau se soucie de l'id, pas du nom du fichier de mot de passe.$(id -u)
est meilleure. Dans certains cas (malveillants), cela$USER
pourrait être faux.Ce que vous voulez réellement, c'est déterminer si vous avez accès à ces opérations. Il est considéré comme une mauvaise pratique de vérifier si vous êtes root au lieu de cela.
Si le système a été configuré pour permettre à un utilisateur non root de modifier le cache de swap et drop page, pourquoi cet utilisateur ne devrait-il pas exécuter votre script?
Au lieu de cela, vous pouvez simplement essayer l'opération et quitter avec un message utile en cas d'échec:
la source
exit
après que quelque chose échoue, au cas où l'utilisateur voudrait en faire autant qu'il le peut avec ses privilèges actuels. (Mais pour un système typique où tout cela nécessite un root, sortir serait plus utile / moins bruyant.)