Solution 1 :
Pour exécuter votre script en tant qu'un autre utilisateur en une seule commande, exécutez :
/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres
Breaking it down:
/bin/su : switch user
-c "/path/to..." : command to run
- : option to su, make it a login session (source profile for the user)
postgres : user to become
Je recommande de toujours utiliser des chemins complets dans des scripts comme celui-ci - vous ne pouvez pas toujours garantir que vous serez dans le bon répertoire lorsque vous su (peut-être que quelqu'un a changé le homedir sur vous, qui sait). J'utilise aussi toujours le chemin complet vers su (/bin/su) parce que je suis paranoïaque. Il est possible que quelqu'un puisse modifier votre chemin et vous amener à utiliser une version compromise de su.
Solution 2 :
Si l'utilisateur cible à exécuter a défini un shell nologin, vous pouvez utiliser l'option -s pour spécifier le shell :
/bin/su -s /bin/bash -c '/path/to/your/script' testuser
Voir la question suivante :exécuter le script en tant qu'utilisateur qui n'a pas de shell de connexion
Solution 3 :
Pour automatiser cela selon un calendrier, vous pouvez le mettre dans la crontab de l'utilisateur. Les tâches cron n'obtiendront pas l'environnement complet, mais il serait peut-être préférable de mettre toutes les variables d'environnement dont vous avez besoin dans le script lui-même de toute façon.
Pour modifier la crontab de l'utilisateur :
sudo crontab -u postgres -e
Solution 4 :
Cela devrait être une lecture informative -- setuid sur les scripts shell
Si vous exécutez su avec un "- username
" séquence d'arguments, il créera un shell de connexion pour que l'utilisateur donne le même environnement que l'utilisateur. Habituellement, utilisé pour exécuter rapidement votre script avec votre environnement d'accueil à partir d'une connexion différente.
Solution 5 :
Essayez la page de manuel su :
su -c script_run_as_postgres.sh - postgres
Alternativement, vous pouvez utiliser sudo pour vous permettre d'exécuter uniquement cette commande en tant que postgres sans mot de passe. Cela nécessite cependant une certaine configuration dans votre /etc/sudoers.