web-dev-qa-db-fra.com

Ignorer Sudo dans le script bash

J'ai un petit script bash:

#!/bin/bash

touch dummy.txt

Si j'exécute ce script avec Sudo, il créera alors dummy.txt qui sera protégé par une racine.

Ce que je veux faire c'est:

Que ce script soit exécuté avec Sudo ou un utilisateur normal, le fichier dummy.txt devrait ne pas être protégé par une racine.

9
Anonymous

Vous pouvez tester si le script est exécuté via Sudo à l'aide des variables EUID et Sudo_USER, puis exécuter touch comme Sudo_USER si la valeur est vraie.

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $Sudo_USER ]]; then
  Sudo -u "$Sudo_USER" touch dummy.txt
else
  touch dummy.txt
fi
22
steeldriver

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 consiste à abandonner 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

Vous pouvez éventuellement ré-exécuter votre script en tant qu’utilisateur de secours (par exemple, Sudo -u FALLBACK_USER "$0") au lieu d’abandonner simplement.

Essayer de corriger les bizarreries 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 bogues liés à root. Ce n'est pas une solution à l'épreuve du temps, pour ainsi dire.

10
Dmitry Grigoryev

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

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

Ici, le fichier appartient à l'utilisateur racine et au groupe racine; il est lisible et inscriptible par l'utilisateur root, mais uniquement par d'autres.

L’approche la plus simple consisterait simplement à chown renvoyer le fichier à l’utilisateur initial.

chown username:group_name dummy.txt

Vous pouvez utiliser la variable $Sudo_USER qui n'est accessible que lorsque Sudo est appelée, comme suit:

chown "$Sudo_USER":"$Sudo_USER" dummy.txt

Si vous exécutez le script en tant qu'utilisateur ordinaire, la partie chown n'est pas du tout nécessaire. Par conséquent, vous pouvez envisager d'utiliser if-statement ou && test pour tester le cas où le script est exécuté en tant que root, et fais quelque chose dans ce sens:

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

Ce qui précède est l'approche recommandée. Il y en a d'autres, comme utiliser chmod pour modifier les autorisations de lecture-écriture-exécution des utilisateurs et des groupes, mais cela n'est pas recommandé.

6