Ignorer sudo dans le script bash

9

J'ai un petit script bash:

#!/bin/bash

touch dummy.txt

Si j'exécute ce script avec sudoalors il va créer dummy.txtqui sera protégé par root .

Ce que je veux faire c'est:

Que ce script soit exécuté en utilisant sudoou un utilisateur normal, le fichier nedummy.txt doit pas être protégé par root.

Anonyme
la source
4
Quoi que vous entendiez par «protégé par root», vous pouvez utiliser chownet chmoddans votre script pour définir la propriété et les autorisations comme vous le souhaitez.
fkraiem
1
Il n'est pas clair ce que vous entendez par "root root". Voulez-vous dire que seul l'utilisateur root peut lire / écrire (par exemple, les autorisations de fichier sont définies sur quelque chose comme 700), ou que l'utilisateur root est le propriétaire du fichier?
1
@DoritoStyle désolé pour la confusion. Par root , je voulais dire que l'utilisateur root est le propriétaire du fichier.
Anonyme

Réponses:

22

Vous pouvez tester si le script est en cours d' exécution par l' intermédiaire en sudoutilisant les EUIDet les SUDO_USERvariables, puis exécuter touchcomme SUDO_USERsi vrai - quelque chose comme

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
tournevis
la source
2
Notez que ==utilisé pour la comparaison de chaînes. Puisque $EUIDest censé retourner une valeur entière, je vous recommande d'utiliser la -edcomparaison. Les espaces sont autorisés dans les noms d'utilisateur , alors citez probablement la $SUDO_USERvariable. Sinon, bonne réponse - c'est quelque chose que j'utiliserais personnellement.
Sergiy Kolodyazhnyy
@steeldriver c'est ce que je cherchais. Merci!!
Anonyme
1
Vous pouvez demander au script de se réexécuter sudo -us'il détecte qu'il s'exécute en tant que root. L'OP a parlé d'avoir plusieurs commandes dans un seul script. Mais attention à éviter une boucle infinie sur les erreurs.
Peter Cordes
1
Il n'y a pas de fractionnement de mot à l'intérieur, [[...]]donc pas strictement nécessaire pour citer la variable dans l'instruction if @Serg et I gues -edétait une faute de frappe pour-eq
Arronical
@Arronical oui, c'était une faute de frappe pour -eq. Je ne savais pas qu'il [[n'y avait pas de fractionnement de mots. Merci. Personnellement, je citerais toujours pour de bonnes habitudes de script
Sergiy Kolodyazhnyy
9

Si votre script n'est pas destiné à être exécuté en tant que root, le moyen le plus sûr de résoudre le problème est d'interrompre l'exécution du script au tout début:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

En option, vous pouvez réexécuter votre script en tant qu'utilisateur de secours (par exemple sudo -u FALLBACK_USER "$0") au lieu de simplement abandonner.

Essayer de corriger les caprices de commandes individuelles rendra votre script inutilement complexe et difficile à déboguer. Chaque fois que vous le modifiez, vous devrez effectuer tous les tests deux fois (en tant qu'utilisateur normal, puis en tant que root) et corriger tous les rootbogues liés qui surviennent. Ce n'est pas une solution d'avenir, pour ainsi dire.

Dmitry Grigoryev
la source
6

Par défaut, les fichiers créés avec root root ont les autorisations suivantes:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Ce fichier appartient à l'utilisateur root et au groupe root, et est lisible et inscriptible par root, mais uniquement lisible par d'autres.

L'approche la plus simple serait de chownrenvoyer le fichier à l'utilisateur d'origine.

chown username:group_name dummy.txt

Vous pouvez utiliser une $SUDO_USERvariable accessible uniquement lorsqu'elle sudoest appelée, comme ceci:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Si vous exécutez le script en tant qu'utilisateur normal, la chownpartie n'est pas nécessaire du tout, vous pouvez donc envisager d'utiliser if-statement ou &&test pour tester le cas où le script est exécuté en tant que root, et faire quelque chose comme suit:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

L'approche ci-dessus est recommandée. Il y en a d'autres, comme l'utilisation chmodpour modifier les autorisations de lecture-écriture-exécution pour les utilisateurs et le groupe, mais ce n'est pas recommandé.

Sergiy Kolodyazhnyy
la source
Merci pour votre réponse. Mais dans QI, je viens d'expliquer un scénario simple dans le cas réel, le script original créera de nombreux fichiers. Sous Linux, ne peut-on pas simplement ignorer sudo?
Anonyme
1
@Anonymous si vous exécutez l'intégralité du script avec sudo, alors non - vous ne pouvez pas l'ignorer. Votre option est d'exécuter le script en tant qu'utilisateur normal (ce que je ne comprends pas pourquoi vous ne le faites pas, car vous créez simplement un fichier pour votre utilisateur ici) ou de changer la propriété du fichier comme je le montre dans ma réponse.
Sergiy Kolodyazhnyy
C'est la solution la plus correcte et elle ne devrait pas être si difficile à mettre à l'échelle.
poussins