Bash Scripting: Exiger que le script soit exécuté en tant que root (ou avec sudo)

26

J'essaie d'écrire un script bash (dans Ubuntu) qui sauvegardera un répertoire en utilisant tar.

Comment puis-je effectuer une vérification dans le script afin qu'il ne puisse être exécuté qu'en tant que root (ou avec sudo)?

Par exemple, si un utilisateur exécute le script, il doit indiquer que ce script doit être exécuté avec les privilèges sudo, puis quitter. Si le script est exécuté en tant que root, il continuera après la vérification.

Je sais qu'il doit y avoir une solution facile, je n'ai tout simplement pas pu la trouver en recherchant sur Google.

Cory Plastek
la source

Réponses:

37

Pour extraire l'uid efficace, utilisez cette commande:

id -u

Si le résultat est «0», le script s'exécute en tant que root ou utilise sudo. Vous pouvez exécuter la vérification en faisant quelque chose comme:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi
Scott Pack
la source
5
Je recommanderais de qualifier complètement le chemin vers id (par exemple, / usr / bin / id). Sinon, un utilisateur sournois pourrait écrire son propre script / binaire qui renvoie toujours 0, puis le placer dans un emplacement qui existe plus tôt dans le chemin des utilisateurs exécutants.
ktower
D'accord. Correction avec un montage.
Scott Pack
6
Toute personne «sournoise» essayant d'exécuter le script ne sera pas arrêtée par vous en utilisant le chemin complet vers id.
theotherreceive
Je suis d'accord avec l'autre ... c'est un script bash. Qualifier le bac `` id '' n'empêchera de toute façon pas l'intention de contourner le chèque. Mieux vaut le laisser sans réserve pour la portabilité.
Chris
1
Cela ne répond pas à l'exigence "sudo".
GregB
17

Je suppose que vous savez qu'en changeant la propriété en root

chown root:root file

et définir les autorisations à 700

chmod 700 file

vous accomplirez la même chose - sans la suggestion d'exécuter en tant que sudo.

Mais je posterai cette réponse pour être complet.

Brent
la source
3
Il s'agit d'une solution plus appropriée que la réponse acceptée. - Mon 0,02 $
Chris
Note latérale: archiver le script dans git devient plus difficile. À corriger,sudo git add <file>
Chaim Eliyah
2

Quel est votre objectif ici, pour informer l'utilisateur qu'il doit exécuter le script en tant que root ou par mesure de sécurité?

Si vous souhaitez simplement informer l'utilisateur que l'une des suggestions d'uid est correcte, mais qu'elles sont aussi utiles que des pneus sur un cheval par mesure de sécurité - rien n'empêche un utilisateur de copier le script, de retirer l'instruction if, et l'exécuter de toute façon.

S'il s'agit d'un problème de sécurité, le script doit être défini sur 700, propriété de root: root, afin qu'il ne soit ni lisible ni exécutable par un autre utilisateur.

l'autre reçoit
la source
Ou, il se pourrait que le script nécessite un accès à des fichiers ou des commandes accessibles uniquement à root pour effectuer son travail, comme dans mon cas
chrisbunney
2

Vous pouvez également utiliser la commande whoami.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi
Kiril
la source
En fait, l'uid 0 est le compte d'utilisateur spécial avec tous les privilèges. "root" est simplement l'étiquette / le nom le plus commun mappé à cet UID. Il n'est pas nécessaire qu'il soit «root» et un attaquant peut essayer d'exploiter cela.
0xSheepdog
2

La variable bash $EUIDmontre l'UID efficace sur lequel le script s'exécute, si vous voulez vous assurer que le script s'exécute en tant que root, vérifiez s'il $EUIDcontient la valeur 0 ou non:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

C'est mieux que la solution avec /usr/bin/id(pour les scripts bash!) Car elle ne nécessite pas de commande externe.

neuhaus
la source
1
Au lieu de simplement quitter, pourrait inviter l'utilisateur à se connecter sudo en remplaçant la echoligne par sudo "$0" "$@", et remplacer exit 2par exit $?.
schumacher574
Bonne idée. Cependant, la question demandait un script qui se fermait et non exécutait sudo par lui-même.
neuhaus
0

Une façon simple de rendre le script exécutable uniquement par root est de démarrer le script avec la ligne:
#!/bin/su root

alexandre1985
la source
-1

"#! / bin / su root" permet aux utilisateurs en mode super utilisateur d'exécuter le script sans utiliser le mot de passe root. Si vous voulez que les super utilisateurs exécutent le script avec des résultats identiques à ceux de la racine, cela fait cela.

Lynnux
la source