J'ai un script bash long et de longue durée où une poignée de commandes doivent être exécutées en tant que root tandis que la majorité des commandes doivent être exécutées en tant qu'utilisateur normal avant sudo, car cela gâcherait la propriété du fichier et autres.
J'ai trouvé quelques méthodes, mais chacune a des problèmes
Méthode 1: utiliser sudo dans le fichier
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Cela semblerait bien, d'après la façon dont le code est écrit. sudo
est écrit avant les quelques instructions qui doivent réellement être exécutées par root, mais si le temps entre chaque sudo
appel est trop long, sudo
il demande à nouveau un mot de passe. De plus, si la première exécution de sudo
échoue, par exemple en raison d'un mot de passe invalide, le reste du script est toujours exécuté.
Méthode 2: utiliser sudo pour appeler le fichier, puis revenir à l'utilisateur d'origine si nécessaire
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Cela craint aussi, car je dois ajouter su username -c
devant presque toutes les lignes. Il est également possible de trouver le nom d'utilisateur d'origine après sudo
, mais c'est compliqué.
Y a-t-il une meilleure façon?
Edit: je n'ai posté ici que de petits scripts absurdes pour montrer de quoi je parle. Dans le script actuel, j'ai quelques lignes qui ont besoin de sudo (démarrage et arrêt des services), des lignes où cela n'a pas d'importance s'il y a sudo et pas mal de lignes qui doivent vraiment être exécutées sans sudo.
sudo
s'il doit avoir des autorisations élevées. Mais il est inutile de passersu username -c
à l'exécution d'unecho
. En d'autres termes, cela ressemble à un [XY]. Pourriez-vous modifier et expliquer ce que votre script va réellement faire et pourquoi vous pensez que vous devez changer d’utilisateur si souvent?man sudo
?-v, --validate
'Mettez à jour les informations d'identification mises en cache de l'utilisateur, en authentifiant l'utilisateur si nécessaire. Pour le plugin sudoers, cela prolonge le délai d'attente sudo pendant 15 minutes supplémentaires par défaut, mais n'exécute pas de commande. Toutes les politiques de sécurité ne prennent pas en charge les informations d'identification mises en cache. ' (Si vous l'exécutez assez souvent, l'authentification sudo ne devrait pasRéponses:
Concernant la méthode 2, il est plus facile d'utiliser une fonction. Par exemple:
$SUDO_USER
est le nom d'utilisateur du sudoer. Vous pouvez également utiliser$(logname)
à sa place.Fonctionnant sur ma machine:
la source
En lisant
man sudoers
, on voit:Ainsi, vous pouvez permettre
regular
à l'hôtemachine1
de s'exécutercommand1
et encommand2
tant que root, sans authentification par mot de passe avec:mais lisez chacun
man -k sudo
pour plus de détails.la source
Cela peut peut-être aider:
chmod 775 yourscript.sh
Ensuite, vous pouvez utiliser sudo à l'intérieur du script (sans invite de mot de passe) Et vous ne pouvez pas utiliser sudo pour d'autres commandes à l'intérieur de votre script.
la source
chmod 775
vous permet uniquement d'exécuter le fichier et ne modifie ni l'utilisateur qui exécute le fichier ni ses droits.