Führen Sie ein Shell-Skript als anderer Benutzer aus

42

Was ist eine gute Möglichkeit, ein Shell-Skript als anderer Benutzer auszuführen? Ich verwende Debian Etch und weiß, welchen Benutzer ich nachahmen möchte.

Wenn ich es manuell machen würde, würde ich tun:

su postgres
./backup_db.sh /tmp/test
exit

Da ich den Prozess automatisieren möchte, brauche ich eine Möglichkeit, backup_db.sh als postgres auszuführen (die Umgebung zu erben usw.)

Vielen Dank!

Wadih M.
quelle

Antworten:

67

Führen Sie Folgendes aus, um Ihr Skript als ein Befehl eines anderen Benutzers auszuführen:

/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 diesen immer vollständige Pfade zu verwenden - Sie können nicht immer garantieren, dass Sie sich im richtigen Verzeichnis befinden, wenn Sie su sind (vielleicht hat jemand das Homedir an Ihnen geändert, wer weiß). Ich benutze auch immer den vollständigen Pfad zu su (/ bin / su), weil ich paranoid bin. Möglicherweise kann jemand Ihren Pfad ändern und Sie dazu veranlassen, eine kompromittierte Version von su zu verwenden.

baumgart
quelle
Es wird immer verlangt, dass ich das Passwort eingebe? Wie kann man das umgehen?
zjffdu
2
Sie müssen immer ein Kennwort eingeben, wenn Sie den Befehl als Benutzer ohne Rootberechtigung ausführen. Wenn Sie das Kennwort vermeiden möchten, können Sie sudo so konfigurieren, dass dies zulässig ist. JEDOCH - Wenn Sie sudo so konfigurieren, dass ein Benutzer su ausführen kann, können Sie ein beliebiger Benutzer werden. Ich würde vorschlagen, ein Skript für Ihren Befehl zu erstellen, die Skriptberechtigungen auf 700 zu setzen und das Eigentum von root zu besitzen, und dann sudo so zu konfigurieren, dass ein Benutzer dieses einzelne Skript ausführen kann.
baumgart
Ich glaube, während diese Antwort für das OP funktionieren könnte, ist sie nicht ganz richtig. Meines Wissens startet die Verwendung von beiden -(oder --login) zusammen mit --command, -ceigentlich keine Anmeldesitzung, da -cimmer eine Nicht-Anmeldeshell erzwungen wird.
JeanMertz
1
Hinweis: Aus Gründen der Portabilität - postgresssollte das am Ende des Befehls erscheinen. Von der Manpage:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
jonny
9

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 env-Variablen im Skript selbst zu platzieren.

So bearbeiten Sie die Crontab des Benutzers:

sudo crontab -u postgres -e
Kyle Brandt
quelle
Könnten Sie bitte mehr erklären?
Saravanakumar
3

Dies sollte eine informative Readsetuid für Shell-Skripte sein

Wenn Sie " " su mit einer - usernameArgumentsequenz ausführen , wird eine Anmeldeshell für den Benutzer erstellt, die dieselbe Umgebung wie der Benutzer angibt. Wird normalerweise verwendet, um Ihr Skript schnell über ein anderes Login in Ihrer häuslichen Umgebung auszuführen.

nik
quelle
Dies kann nützlich sein, wenn Sie eine Reihe von Aktionen ausführen müssen. Beachten Sie jedoch, dass die meisten Systemdienstkonten keine gültigen Home-Pfade und Shells haben sollten.
Dan Carley
2

Versuchen Sie die Manpage su:

su -c script_run_as_postgres.sh - postgres

Alternativ können Sie sudo verwenden, um nur dieses Kommando als postgres ohne Kennwort auszuführen. Es erfordert jedoch einige Einstellungen in Ihrer / etc / sudoers.

pjz
quelle
2

Die von anderen veröffentlichte Methode "su -c ..." ist eine gute. Zur Automatisierung können Sie das Skript zur Crontab des Benutzers hinzufügen, unter dem es ausgeführt werden soll.

Geoff Fritz
quelle
1

Wenn der Benutzer bereits einen Eintrag in sudo hat und Sie das Kennwort des Superbenutzers nicht kennen, können Sie Folgendes versuchen: Dieser führt einen Neustart der unter /data/my-db/pgsql/9.6/data initialisierten Postgres durch

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

Sie können auch verwenden:

sudo -u postgres script_run_as_postgres.sh

Xandersoft
quelle