J'ai écrit un script qui prend, comme argument, une chaîne qui est une concaténation d'un nom d'utilisateur et d'un projet. Le script est censé basculer (su) vers le nom d'utilisateur, cd vers un répertoire spécifique basé sur la chaîne du projet.
Je veux essentiellement faire:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Le problème est qu'une fois que je fais un su ... ça attend juste là. Ce qui a du sens puisque le flux d'exécution est passé au passage à l'utilisateur. Une fois que je quitte, le reste des choses s'exécute mais cela ne fonctionne pas comme souhaité.
J'ai ajouté su à la commande svn mais la commande a échoué (c'est-à-dire qu'elle n'a pas mis à jour svn dans le répertoire souhaité).
Comment écrire un script qui permet à l'utilisateur de changer d'utilisateur et d'appeler svn (entre autres)?
chsh
pour les autres utilisateurs. Mon problème est répertorié ici sur stackoverflow.com/q/15307289/80353 Comment adapter votre réponse à ma situation?sudo
ousu
soit d'importance secondaire,sudo
c'est beaucoup plus sûr et pratique.Beaucoup plus simple: utilisez
sudo
pour exécuter un shell et utilisez un heredoc pour le nourrir de commandes.(réponse à l' origine sur SuperUser )
la source
-i
pour obtenirsomeuser
l'environnement attendu.sudo
peut être pratique mais ce n'est pas bon si ce n'est pas prêt à l'emploi (comme sur AIX).su -c 'commands'
est la bonne réponse.Utilisez un script comme celui-ci pour exécuter le reste ou une partie du script sous un autre utilisateur:
la source
whoami
place deid
qui retournera le nom au lieu de l'identifiantsudo
peut être pratique mais ce n'est pas bon si ce n'est pas prêt à l'emploi (comme sur AIX).su -c 'commands'
est la bonne réponse.Vous devez exécuter toutes les commandes des différents utilisateurs comme leur propre script. S'il ne s'agit que d'une ou de quelques commandes, alors en ligne devrait fonctionner. S'il y a beaucoup de commandes, il est probablement préférable de les déplacer vers leur propre fichier.
la source
su -s /bin/bash
.Voici encore une autre approche, qui était plus pratique dans mon cas (je voulais juste supprimer les privilèges root et faire le reste de mon script à partir d'un utilisateur restreint): vous pouvez faire redémarrer le script à partir de l'utilisateur correct. Supposons qu'il soit exécuté en tant que root au départ. Ensuite, cela ressemblera à ceci:
la source
runuser -u $user -- "$@"
, comme indiqué dans su (1)exec su "$user" "$0" -- "$@"
--
est vraiment utile.Utilisez
sudo
plutôtEDIT : Comme Douglas a souligné, vous ne pouvez pas utiliser
cd
ensudo
car il est pas externe commande. Vous devez exécuter les commandes dans un sous-shell pour faire lecd
travail.Vous pouvez être invité à saisir le mot de passe de cet utilisateur, mais une seule fois.
la source
sudo
peut être pratique mais ce n'est pas bon si ce n'est pas prêt à l'emploi (comme sur AIX).su -c 'commands'
est la bonne réponse.Il n'est pas possible de changer d'utilisateur dans un script shell. Les solutions de contournement utilisant sudo décrites dans d'autres réponses sont probablement votre meilleur pari.
Si vous êtes assez fou pour exécuter des scripts perl en tant que root, vous pouvez le faire avec les
$< $( $> $)
variables qui contiennent uid / gid réel / effectif, par exemple:la source
Cela a fonctionné pour moi
J'ai séparé mon «approvisionnement» de mon «démarrage».
puis dans mon start_env.sh
la source
Inspiré par l'idée de @ MarSoft mais j'ai changé les lignes comme suit:
J'ai l'habitude
sudo
d'autoriser un mot de passe moins l'exécution du script. Si vous souhaitez entrer un mot de passe pour l'utilisateur, supprimez le fichiersudo
. Si vous n'avez pas besoin des variables d'environnement, supprimez-E
de sudo.Le
/usr/bin/bash -l
garantit que lesprofile.d
scripts sont exécutés pour un environnement initialisé.la source
sudo
peut être pratique mais ce n'est pas bon si ce n'est pas prêt à l'emploi (comme sur AIX).su -c 'commands'
est la bonne réponse.sudo
. En fait, sudo n'est pas si simple, dans de nombreux cas, vous avez besoin de mêmesudo -E
et d'une entrée de configuration dans sudoers.d pour permettre l'exécution sans tty avec!requiretty
. Mais il existe de nombreux cas où sudo est nécessaire pour les scripts appelés automatiques, où une boîte de dialogue de mot de passe peut interférer. Ainsi, je ne le retirerais pas d'une solution standard."$@"
d'une chaîne signifie que les arguments après le premier sont ajoutés dans une chaîne séparée, non incluse dans l'-c
argument. Si vous vouliez le rendre sûr, vous pourriezprintf -v arg_q '%q ' "$0" "$@"
et ensuite utilisersu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
COMMANDARGS=$@
résout le problème avec-c
. Les arguments avec des espaces n'étaient pas un problème avant, mais j'ai implémenté votre bonne entrée. Je devais juste faire quelques expériences pour que cela fonctionne. Je 'ai édité la question et j'espère que je n'ai pas collé un autre bogue. Merci pour votre commentaire, humiliant mais nécessaire.