Ignorer sudo dans le script bash

J’ai un petit script bash:

#!/bin/bash touch dummy.txt 

Si dummy.txt ce script avec sudo il créera 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 ne doit 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 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 

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 résoudre tous les bogues liés à la 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 permissions 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 accessible en écriture par l’utilisateur root, mais uniquement par d’autres.

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

 chown username:group_name dummy.txt 

Vous pouvez utiliser la variable $SUDO_USER accessible uniquement lorsque sudo est appelée, comme $SUDO_USER :

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

Si vous exécutez un script en tant qu’utilisateur standard, la partie chown n’est pas du tout nécessaire. 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 procédez comme suit. :

 #!/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 permissions de lecture-écriture-exécution pour les utilisateurs et les groupes, mais ce n’est pas recommandé.