Frage Führen Sie ein Shell-Skript als einen anderen Benutzer aus


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

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

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

Da ich den Prozess automatisieren möchte, muss ich backup_db.sh als Postgres ausführen (erbt die Umgebung, etc)

Vielen Dank!


32
2017-07-23 02:43


Ursprung




Antworten:


Führen Sie Folgendes aus, um das Skript als einen anderen Benutzer als einen Befehl 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 immer, vollständige Pfade in solchen Skripten zu verwenden - man kann nicht immer garantieren, dass man sich im richtigen Verzeichnis befindet, wenn man su hat (vielleicht hat jemand das Homedir geändert, wer weiß). Ich benutze auch immer den vollständigen Pfad zu su (/ bin / su), weil ich paranoid bin. Es ist möglich, dass jemand deinen Pfad bearbeiten und eine kompromittierte Version von su verwenden kann.


52
2017-07-23 03:00



Muss ich immer ein Passwort eingeben? Wie kann man es umgehen? - zjffdu
Sie müssen immer ein Kennwort eingeben, wenn Sie den Befehl als Benutzer ohne Rootberechtigung ausführen. Wenn Sie das Passwort vermeiden wollen, können Sie sudo so konfigurieren, dass dies erlaubt wird. JEDOCH - Durch die Konfiguration von sudo, damit ein Benutzer su ausführen kann, können sie zu jedem Benutzer werden. Ich würde vorschlagen, ein Skript für Ihren Befehl zu erstellen, die Skriptberechtigungen auf 700 zu setzen und dem Root zu gehören, und dann sudo zu konfigurieren, damit ein Benutzer dieses einzelne Skript ausführen kann. - baumgart
Ich glaube - während diese Antwort für das OP funktionieren könnte - ist es nicht ganz korrekt. Nach meinem Wissen, beide zu verwenden - (oder --login) zusammen mit --command, -c startet eigentlich keine Login-Sitzung, weil -c erzwingt immer eine Nicht-Login-Shell. - JeanMertz
Hinweis: für Portabilität, die - postgresssollte am Ende des Befehls erscheinen. Von der man-Seite: 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


Wenn für den auszuführenden Zielbenutzer nologin shelll definiert ist, können Sie die Shell mithilfe der Option -s angeben:

/bin/su -s /bin/bash -c '/path/to/your/script' testuser

Siehe die folgende Frage: Führen Sie das Skript als Benutzer aus, der über eine nologin-Shell verfügt


15
2017-07-23 10:46





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 in das Skript selbst zu übernehmen.

So bearbeiten Sie die crontab des Benutzers:

sudo crontab -u postgres -e

8
2017-07-23 02:47



Könntest du bitte mehr erklären? - saravanakumar


Dies sollte eine informative Lektüre sein - setuid für Shell-Skripte

Wenn du läufst su mit einer "- username"Argument Sequenz, es wird eine Login-Shell für den Benutzer zu geben, um die gleiche Umgebung wie der Benutzer zu geben. In der Regel verwendet, um Ihr Skript schnell mit Ihrer Heimatumgebung von einem anderen Login ausführen.


2
2017-07-23 02:58



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


Probieren Sie die Hilfeseite:

su -c script_run_as_postgres.sh - postgres

Alernately, konnten Sie sudo verwenden, um Ihnen zu erlauben, genau diesen comman als Postgres ohne ein Kennwort laufen zu lassen. Es erfordert jedoch einige Einstellungen in Ihrem / etc / sudoers.


1
2017-07-23 03:19





Die von anderen gepostete Methode "su-c ..." ist eine gute. Für die Automatisierung könnten Sie das Skript der crontab des Benutzers hinzufügen, für den Sie es ausführen möchten.


1
2018-05-01 17:36





Wenn der Benutzer bereits einen Eintrag in sudo hat und Sie das Passwort des Superusers nicht kennen, können Sie folgendes versuchen: Dieser startet die postgres neu, die unter /data/my-db/pgsql/9.6/data initialisiert wurden

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"

0
2018-04-14 23:30