Quelle est la bonne façon d'exécuter un script Shell en tant qu'utilisateur différent. J'utilise Debian etch, et je sais quel utilisateur je veux emprunter.
Si je le faisais manuellement, je ferais:
su postgres
./backup_db.sh /tmp/test
exit
Comme je veux automatiser le processus, j'ai besoin d'un moyen d'exécuter backup_db.sh en tant que postgres (héritant de l'environnement, etc.)
Merci!
Pour exécuter votre script en tant qu’autre utilisateur en tant que 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 également 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 obliger à utiliser une version compromise de su.
Si l'utilisateur cible à exécuter a nologin shelll défini, 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 disposant de nologin Shell
Pour automatiser cela selon un calendrier, vous pouvez le mettre dans la crontab de l'utilisateur. Les tâches Cron n'obtiendront cependant pas l'environnement complet, mais il serait peut-être préférable de mettre toutes les variables env dont vous avez besoin dans le script lui-même.
Pour éditer la crontab de l'utilisateur:
Sudo crontab -u postgres -e
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 domestique à partir d'une connexion différente.
Essayez la page de manuel su:
su -c script_run_as_postgres.sh - postgres
Vous pouvez également utiliser Sudo pour vous permettre d'exécuter uniquement cette comman en tant que postgres sans mot de passe. Cependant, cela nécessite une configuration dans votre/etc/sudoers.
La méthode "su -c ..." publiée par d'autres est une bonne méthode. Pour l'automatisation, vous pouvez ajouter le script à la crontab de l'utilisateur dont vous avez besoin pour l'exécuter.
Si l'utilisateur a déjà une entrée dans Sudo et que vous ne connaissez pas le mot de passe du superutilisateur, vous pouvez essayer ce qui suit: Celui-ci redémarre les postgres initialisés dans /data/my-db/pgsql/9.6/data
Sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
Vous pouvez aussi utiliser:
Sudo -u postgres script_run_as_postgres.sh