Comment écrire un script shell qui exécute des commandes en tant que superutilisateur et certaines commandes pas en tant que super-utilisateur, sans avoir à garder des enfants il?
Je veux écrire un script shell pour automatiser une série de commandes. Le problème est que certaines commandes DOIT être exécuté en tant que superutilisateur et certaines commandes ne DOIT PAS être exécuté en tant que superutilisateur. Ce que j'ai fait jusqu'à présent est quelque chose comme ceci:
#!/bin/bash
command1
sudo command2
command3
sudo command4
Le problème est, cela signifie que quelqu'un doit attendre jusqu'à ce que command1 finitions avant qu'ils êtes invité pour un mot de passe, puis, si command3 prend assez longtemps, puis, ils devront attendre pour command3 à la fin. Ce serait bien si la personne peut se lever et marcher loin, puis de revenir une heure plus tard et à faire. Par exemple, le script suivant a ce problème:
#!/bin/bash
sleep 310
sudo echo "Hi, I'm root"
sleep 310
sudo echo "I'm still root?"
Comment puis-je faire en sorte que l'utilisateur peut simplement entrer leur mot de passe une fois, au tout début, et puis à pied?
Mise à jour:
Merci pour les réponses. Je suis en cours d'exécution sur Mac OS X Lion et a couru Stephen P du script et a obtenu des résultats différents: (j'ai aussi ajouté $HOME)
pair@abbey scratch$ ./test2.sh
uid is 501
user is pair
username is
home directory is /Users/pair
pair@abbey scratch$ sudo ./test2.sh
Password:
uid is 0
user is root
username is root
home directory is /Users/pair
Vous devez vous connecter pour publier un commentaire.
Fichier
sutest
de l'exécuter: `./sutest' me donne
mais l'utilisation de sudo:
sudo ./sutest
donneSi vous conservez le nom d'utilisateur d'origine dans $nom d'utilisateur lors de l'exécution comme sudo. Cela conduit à une solution similaire à ce que d'autres posté le:
Juste sudo pour appeler votre script en premier lieu, il vous demandera le mot de passe une fois.
Départ, j'avais écrit cette réponse sur Linux, qui n'ont quelques différences avec OS X
OS X (je suis en essais ce sur Mountain Lion 10.8.3) a une variable d'environnement
SUDO_USER
lorsque vous utilisez sudo, qui peut être utilisé à la place deUSERNAME
ci-dessus, ou pour être plus multi-plateforme le script pourrait vérifier pour voir si SUDO_USER est de définir et utiliser si oui, ou utiliser nom d'utilisateur si c'est réglé.La modification de l'original script pour OS X, il devient...
Un premier coup de couteau à la croix-plate-forme pourrait être...
suid
ensemble de bits, mais qui peut être dangereux si vous ne le faites pas droit. De tout temps, vous êtes en cours d'exécution des scripts shell en tant que root, vous pouvez envisager d'utilisertrap
de traiter les signaux. shelldorado.com/goodcoding/tempfiles.html a quelques exemples.pair@abbey scratch$ ./test2.sh
<br/>uid is 501
<br/>user is pair
<br/>username is
<br/>home directory is /Users/pair
<br/>pair@abbey scratch$ sudo ./test2.sh
<br/>Password:
<br/>uid is 0
<br/>user is root
<br/>username is root
<br/>home directory is /Users/pair
<br/>pair@abbey scratch$ sudo -u pair ./test2.sh
<br/>uid is 501
<br/>user is pair
<br/>username is pair
<br/>home directory is /Users/pair
<br/>${SUDO_USER}
.env | grep USERNAME
et rien ne s'est présenté, mais quand j'ai tapésudo env | grep USERNAME
il montra commeUSERNAME=root
SUDO_USER
. J'ai courusudo env | grep jesse
de voir quelles variables ont été encore mon nom d'utilisateurVous devez exécuter votre script en entier en tant que superutilisateur. Si vous souhaitez exécuter une commande en tant que non-super-utilisateur, utilisez l'option "-u" option de sudo:
Lors de l'exécution en tant que root, sudo n'est pas demander un mot de passe.
Si vous utilisez cette option, vérifiez
man sudo
trop:Bien, vous avez quelques options.
Vous pouvez configurer sudo pour ne pas demander un mot de passe. Ce n'est pas recommandé, en raison des risques de sécurité.
Vous pouvez écrire un script expect lire le mot de passe et de mettre à la disposition de sudo lorsque nécessaire, mais c'est maladroit et fragile.
Je recommanderais de la conception de l'exécution du script en tant que root et abandonner ses privilèges à chaque fois qu'ils ne sont pas nécessaires. Tout simplement
sudo -u someotheruser command
pour les commandes qui ne nécessitent pas de racine.(Si ils ont à exécuter en tant qu'utilisateur d'invoquer le script, alors vous pourriez avoir le script enregistrer le uid et invoquer un second script via la commande sudo avec l'id comme un argument, de sorte qu'il sait qui à su..)