web-dev-qa-db-fra.com

Exécuter un script Shell en tant qu'utilisateur différent

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!

44
Wadih M.

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.

69
baumgart

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

23
Basil A

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
9
Kyle Brandt

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.

3
nik

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.

2
pjz

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.

2
Geoff Fritz

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"
1
smishra

Vous pouvez aussi utiliser:

Sudo -u postgres script_run_as_postgres.sh

0
Xandersoft