[Résolu] Exécuter un script cron avec un utilisateur spécifique

Hello !

Je ne connais pas grand chose à cron (j’ai seulement quelques commandes à exécuter par root, de ce côté là pas de soucis particulier).
J’ai écrit un script bash pour sauvegarder les bases de données de mon serveur. Comme j’ai plusieurs utilisateurs de base de données, ce script fait intervenir la variable $USER (pour préciser où créer les fichiers, entre autres).

Quand j’exécute le script manuellement, en étant connecté en tant qu’utilisateur A ou B, tout se passe comme prévu, mais les exécutions cron semblent avoir un problème au niveau des utilisateurs (echo $USER renvoie une chaîne vide). Le script est tout de même exécuté, par ailleurs.
Voici mon /etc/crontab:

[code]# m h dom mon dow user command

42 6 * * * userA /usr/bin/backup_db.sh
47 6 * * * userB /usr/bin/backup_db.sh[/code]

Le script backup_db.sh est exécutable pour le groupe dont font partie userA et userB.

A toutes fins utiles, voici aussi le script concerné:
http://pastebin.com/p1ivVP4R

(je le colle sur pastebin parce qu’il y a la syntaxe bash et c’est quand même bien pratique)

Pour récapituler: comment faire exécuter un script cron dans l’environnement d’un utilisateur en particulier ?

Merci d’avance !

PS: le script n’est pas parfait et est encore en travaux, mais pour l’instant il fait ce dont j’ai besoin (plus tard j’ajouterai aussi une gestoin d’erreur en cas de clés pgp introuvables, par exemple)

Comme moyens de faire marcher ton script, je pense à deux solutions (mais je n’ai testé aucune des deux) :

  • user=$(whoami) au début de ton script ;
  • 42 6 * * * userA env USER="userA" /usr/bin/backup_db.sh dans la crontab.
1 J'aime

salut,

on utilise plutôt les crontab système pour les opérations systèmes;
les autres (les crontab utilisateurs) sont éditées avec la commande crontab -e

à mon avis, le script devrait accepter un ou plusieurs noms d’utilisateurs en arguments, et faire boucler les commandes de sauvegardes pour chacun.

donc, un seul appel de ton script avec la liste des utilisateurs en argument , dans la crontab de root

  • user=$USER, autant utiliser $USER, mais ce ne sera plus utile, car ce sera for user in “$@”; do …sauvegarde…; done
  • les fichiers temporaires devraient être sous /tmp/
  • on utilisera plutôt mapfile pour définir un tableau à partir d’un fichier.

Ça fonctionne, nikel. Gros merci ! :slight_smile:

@Watael:
les utilisateurs des bases de données sur mon serveur n’ont pas la permission d’utiliser crontab, mais sinon je suis assez d’accord sur le principe d’appeler les noms d’utilisateurs de BDD dans le script. Pas tous les utilisateurs par contre (c’est un serveur domestique dans ma colocation qui a plein d’autres fonctions que SGBD).
Je ne mets pas les fichiers dans /tmp parce que je veux les garder un certain temps (c’est des sauvegardes après tout, en cas de problème sur l’envoi de l’archive par mail, c’est bien d’avoir une copie quelque part).
Je connaissais pas mapfile, je vais regarder ça.

Tu pourrais aussi compresser tes archives (une fois qu’elles sont complètes mais avant de les chiffrer, sinon, tu auras un taux de compression normalement ridicule).

on ne s’est pas compris.

je disais d’utiliser le compte root pour appeler le script dans sa crontab, avec la liste des utilisateurs pour qui il faut effectuer une sauvegarde.
=>
sudo -i #on passe root crontab -e #on édite la crontab root, en y ajoutant (sans la marque de commentaire, bien sûr) # 47 6 * * * /usr/bin/backup_db.sh userA userB user...
le script doit être légèrement remanier pour être utiliser par root et boucler (comme je l’ai montré précédemment) sur la liste des arguments.

Ah yes oui OK.
Je pensais à faire appeler par root le script sans arguments, mais remanier le script pour remplir un autre tableau qui contiendrait les noms des utilisateurs du groupe, et boucler dessus. Ce qui revient au même, du coup. C’est vrai que ce serait bien plus élégant. J’ai encore pas mal de choses à améliorer/implémenter sur ce truc.

Merci pour vos retours en tout cas !