2009-08-25 16 views
21

Je semble être coincé entre une limitation NFS et une limitation Cron. J'ai donc le cron racine (sur RHEL5) qui exécute un script shell qui, entre autres choses, doit rsync certains fichiers sur un montage NFS. Et les fichiers sur le montage NFS sont la propriété de l'utilisateur apache avec le mode 700, donc seul l'utilisateur apache peut exécuter la commande rsync - en cours d'exécution comme root génère une erreur d'autorisation (NFS étant un cas rare, apparemment Quand je veux juste exécuter le rsync à la main, je peux utiliser "sudo -u apache rsync ..." Mais pas de travail dans cron - il dit "sudo: désolé, vous doit avoir un tty pour exécuter sudo ". Je ne veux pas exécuter le script entier en tant qu'apache (c'est-à-dire depuis la commande crontab d'Apache) car d'autres parties du script requièrent root - c'est juste une commande qui doit être exécutée en tant qu'apache. Et je préférerais vraiment ne pas changer le mode sur les fichiers, car cela impliquera des changements significatifs à d'autres applications.Comment exécuter une commande en tant qu'utilisateur différent d'un cronjob racine?

Il doit y avoir un moyen d'accomplir "sudo -u apache" de cron ??

merci! voler

+1

Pourrait être mieux servi en déplaçant cela sur SuperUser.com. – Robert

+0

Il s'agit d'une vieille question, mais elle est toujours très bonne dans les classements de recherche, et aucune des réponses n'aborde les raisons pour lesquelles les autorisations root ne s'appliquent pas au montage NFS. Pour quelqu'un d'autre qui trébuche sur cela, la raison est root_squash. Ce blog a une explication assez décente pour laquelle cette option est nécessaire et généralement définie par défaut. http://fullyautolinux.blogspot.com/2015/11/nfs-norootsquash-and-suid-basic-nfs.html – BryKKan

Répondre

7

Utilisation su au lieu de sudo:

su -c "rsync ..." apache 
+1

Oui! Mais non. L'utilisateur apache n'a pas de shell de connexion standard, donc la syntaxe su -c ne renvoie que "Ce compte n'est actuellement pas disponible". Et modifier l'entrée mot de passe de l'utilisateur apache à cet effet semble être une mauvaise idée. Hm, je suppose que cette question devrait être intitulée "Comment puis-je exécuter une commande en tant qu'utilisateur apache d'un cronjob racine?" Et peut-être que cela ne peut pas être fait sans introduire des trous de sécurité? – rob

+5

Cela vous aide-t-il si vous spécifiez explicitement le shell à utiliser avec le commutateur '-s' (par exemple' -s/bin/sh')?Au moins sur Ubuntu, cela semble aider si l'utilisateur en question n'a pas de shell valide dans/etc/passwd. –

+0

@JukkaMatilainen - Oui cela a fonctionné pour moi aussi dans Ubuntu. – runamok

1

lieu dans/etc/crontab et spécifier apache au lieu de racine dans le champ utilisateur

+0

Ne fonctionne pas sur mon Debian 6. –

17

su --shell =/bin/bash - -session-command = "/ chemin/vers/commande -argument = quelque chose" nom d'utilisateur &

Works pour moi (CentOS)

+0

Je devais ajouter 'export TERM = xterm;' avant ma commande dans la variable '--session-command'. Ainsi, je me suis retrouvé avec 'su --shell =/bin/bash --session-command =" exporter TERM = xterm;/chemin/vers/commande -argument = quelque chose "nom d'utilisateur &' –

+0

Ne fonctionne pas sur Ubuntu (12.04) car la commande 'su' ne supporte pas l'option' --session-command'. – Lambart

+0

pour clarifier la réponse, dans le fichier crontab de root, ajoutez le 'su --shell =/bin/bash --session-command ="/chemin/vers/commande -argument = quelque chose "nom d'utilisateur" – NoelProf

1

Si vous voulez vous permettre en permanence à bricoler qu'Apache:

chsh apache 

ce qui vous permet changer le shell pour l'utilisateur