Lösung 1:
Um Ihr Skript als ein anderer Benutzer als einen Befehl auszuführen, führen Sie Folgendes aus:
/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
Ich empfehle, in Skripten wie diesem immer vollständige Pfade zu verwenden - Sie können nicht immer garantieren, dass Sie sich im richtigen Verzeichnis befinden, wenn Sie su (vielleicht hat jemand das Homedir bei Ihnen geändert, wer weiß). Ich verwende auch immer den vollständigen Pfad zu su (/bin/su), weil ich paranoid bin. Es ist möglich, dass jemand Ihren Pfad bearbeitet und Sie veranlasst, eine kompromittierte Version von su zu verwenden.
Lösung 2:
Wenn für den auszuführenden Zielbenutzer nologin shelll definiert ist, können Sie die Option -s verwenden, um die Shell anzugeben:
/bin/su -s /bin/bash -c '/path/to/your/script' testuser
Siehe folgende Frage:Skript als Benutzer ausführen, der keine Login-Shell hat
Lösung 3:
Um dies nach einem Zeitplan zu automatisieren, können Sie es in die Crontab des Benutzers einfügen. Cron-Jobs erhalten zwar nicht die vollständige Umgebung, aber es ist möglicherweise besser, alle benötigten Umgebungsvariablen sowieso in das Skript selbst einzufügen.
So bearbeiten Sie die Crontab des Benutzers:
sudo crontab -u postgres -e
Lösung 4:
Dies sollte eine informative Lektüre sein – setuid auf Shell-Skripten
Wenn Sie su ausführen mit einem "- username
"-Argumentsequenz wird eine Login-Shell für den Benutzer erstellt, um dieselbe Umgebung wie der Benutzer bereitzustellen. Wird normalerweise verwendet, um Ihr Skript schnell mit Ihrer Heimumgebung von einem anderen Login aus auszuführen.
Lösung 5:
Probieren Sie die su-Manpage aus:
su -c script_run_as_postgres.sh - postgres
Alternativ können Sie sudo verwenden, um nur diesen Befehl als Postgres ohne Passwort auszuführen. Es erfordert jedoch einige Einstellungen in /etc/sudoers.