Comment arrêter un script de s'exécuter si ce n'est pas root (et echo "Ne pas s'exécuter en tant que root! Exiting …")

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 choses, et il fait écho qu'il doit être exécuté en tant que root dans le terminal. En gros, 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 s'exécute normalement. Des idées? Merci!

 #!/bin/sh if [ "$(id -u)" -ne 0 ]; then echo 'This script must be run by root' >&2 exit 1 fi cat <<HEADER Host: $(hostname) Time at start: $(date) Running cache maintenance... HEADER swapoff -a && swapon -a echo 1 >/proc/sys/vm/drop_caches cat <<FOOTER Done. Time at end: $(date) FOOTER 

L'user root a UID 0 (quel que soit le nom du count "root"). Si l'UID effectif returnné par id -u n'est pas nul, l'user n'exécute pas le script avec les droits root. Utilisez id -ru pour tester l'ID réel (l'UID de l'user invoquant le script).

Je pense que ce que vous voulez est plutôt de vérifier que vous avez des privilèges de super-user, c'est-à-dire que votre ID user effectif est 0.

zsh et bash rendent cela disponible dans la variable $EUID , donc vous pouvez faire:

 if ((EUID != 0)); then echo >&2 "Error: script not running as root or with sudo! Exiting..." exit 1 fi 

Avec n'importe quel shell POSIX, vous pouvez utiliser la command id standard:

 if [ "$(id -u)" -ne 0 ]; then echo >&2 "Error: script not running as root or with sudo! Exiting..." exit 1 fi 

Notez que tout id -un ou whoami ou la variable $USERNAME dans zsh vous obtiendront le premier nom d'user pour le uid. Sur les systèmes qui ont d'autres users avec l'ID 0, cela peut ne pas être root même si le process est un descendant d'un qui a été authentifié en tant que root .

$USER vous donnera généralement l'user authentifié, mais il est assez fragile. Il n'est pas défini par le shell, mais est généralement défini par la command d'authentification (comme login , su (sur les systèmes GNU / Linux, pas nécessairement les autres), sudo , sshd …). Ce n'est pas toujours le cas (changer l'uid ne configure pas automatiquement cette variable, cela doit être fait explicitement par l'application qui change le uid) et il pourrait aussi avoir été modifié par un autre process dans l'ascendance du shell. $LOGNAME , avec la même mise en garde est plus fiable car il est spécifié par POSIX (à l'origine de FIPS 151-2)

Vous pouvez utiliser $USER ou whoami pour vérifier l'user actuel.

 if [[ "$USER" != "root" ]]; then echo "Error: script not running as root or with sudo! Exiting..." exit 1 fi if [[ $(whoami) != "root" ]]; then echo "Warning: script must be run as root or with elevated privileges!" exit 1 fi if [[ $(id -u) != "0" ]]; then echo "Error: script not running as root or with sudo! Exiting..." exit 1 fi 

Ce que vous voulez réellement, c'est déterminer si vous avez access à 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 user non root de modifier l'échange et le cache de la page, pourquoi cet user ne devrait-il pas exécuter votre script?

Au lieu de cela, vous pouvez simplement essayer l'opération et sortir avec un message utile s'il échoue:

 if ! ( swapoff -a && swapon -a ) then echo "Failed to clear swap (rerun as root?)" >&2 exit 1 fi if ! echo 1 > /proc/sys/vm/drop_caches then echo "Failed to free page cache (rerun as root?)" >&2 exit 1 fi