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.
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
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.
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é.