web-dev-qa-db-fra.com

Script BASH, sur www-data pour une seule commande

Je travaille sur l'automatisation de la création de référentiels Subversion et des sites Web associés comme décrit dans ce billet de blog que j'ai écrit . Je rencontre des problèmes tout autour de la partie où je demande à l'utilisateur www-data d'exécuter la commande suivante:

svnadmin create /svn/repository

Il y a une vérification au début du script qui s'assure qu'il s'exécute en tant que root ou Sudo, et tout après cette commande doit être exécuté en tant que root. Existe-t-il un bon moyen d'exécuter cette commande en tant que www-data, puis de revenir à la racine pour terminer?

26
Brendon Dugan

Utilisez simplement su - www-data -c 'svnadmin create /svn/repository' dans votre script exécuté par root. Pour que seule cette commande soit exécutée par l'utilisateur www-data.


Mise à jour pour les futurs téléspectateurs:

Si vous recevez un "This account is currently not available" erreur, pensez à utiliser:

su - www-data -s /bin/bash -c 'svnadmin create /svn/repository'

(La précieuse mention de @Petr à propos de -s drapeau pour accueillir www-data aucune politique de connexion de l'utilisateur)

24
johnshen64

Avec 'su' est probablement cette demande de mot de passe, et www-data n'a pas de mot de passe. Je recommande la commande Sudo:

 Sudo -u www-data command

La condition est que votre utilisateur doit être root ou configuré dans le fichier sudoers

64
futbolsalas15

Utilisez su:

   su [options] [username]

   The options which apply to the su command are:

   -c, --command COMMAND
       Specify a command that will be invoked by the Shell using its -c.
3
MikeyB

2 approches possibles:


1) Sudo commande:

Dans la plupart des cas, vous aurez accès à la commande Sudo et donc la solution est simplement:

Sudo -u target_user target_command


2) su commande (si Sudo n'est pas installé. Ex. Alpine-linux images):

su - target_user -c 'target_command'

Dans le cas où vous recevez une erreur 'Ce compte n'est actuellement pas disponible' , l'utilisateur n'a pas de connexion (accès Shell) politique en vigueur. Si oui, envisagez d'utiliser:

su - target_user -s /bin/bash -c 'target_command'

(D'après le précieux commentaire de @Petr sur -s drapeau pour accueillir www-data aucune politique de connexion de l'utilisateur)

2
Iceman