Ich habe das folgende Problem: Auf jedem Computer, auf dem Postgresql ausgeführt wird, gibt es einen speziellen Benutzer postgres . Dieser Benutzer hat Administratorzugriff auf den Datenbankserver.
Jetzt möchte ich ein Bash-Skript schreiben, das einen Datenbankbefehl mit psql als Benutzer postgres ausführt (psql wird als Benutzer postgres ausgeführt , nicht als Skript). Bisher wäre das kein Problem: Ich könnte das Skript einfach als Benutzer postgres ausführen .
Ich möchte jedoch die Ausgabe von psql in eine Datei in einem Verzeichnis schreiben, in dem postgres keinen Schreibzugriff hat.
Wie kann ich das machen?
Ich dachte jedoch darüber nach, EUIDs im Skript selbst zu ändern:
- Ich konnte keine Möglichkeit finden, die EUID in einem Bash-Skript zu ändern
- Wie kann ich die EUID ändern, wenn ich so etwas verwende
psql -U postgres -c "<command>" > file
?
linux
bash
permissions
shell-script
Christoph Wurm
quelle
quelle
Antworten:
Verwenden Sie eine Unterschale:
(su -c 'psql -U postgres -c "<command>"' postgres) > file
Innerhalb der Subshell können Sie Berechtigungen für Ihre Arbeit löschen, die Ausgabe wird jedoch an Ihre ursprüngliche Shell umgeleitet, die noch über Ihre ursprünglichen Berechtigungen verfügt.
quelle
Vielleicht möchten Sie diesen Trick anwenden:
tee(1)
ist das POSIX-Dienstprogramm, daher können Sie sich auf seine Verfügbarkeit verlassen.Oder mit
sudo
:quelle
sudo -u postgres psql -c '...' > file
sudoers und bearbeiten Sie es, um die Passwortabfragen für diesen Befehl zu deaktivierenSie können das Shell-Skript ausführen, wenn der Benutzer über eine bessere Schreibberechtigung verfügt (z. B. root). Wenn Sie die Daten ausgeben, sollten Sie in einen Ordner schreiben, in den der Datenbankbenutzer postgres schreiben kann (z. B. / tmp).
Verschieben Sie es nach Abschluss des Datenschreibvorgangs in das Verzeichnis, in das Ihr Shell-Skript schreiben darf (so wie Root-Benutzer überall schreiben können).
quelle
Wenn Sie knifflige Wege finden, um Sicherheitsbeschränkungen zu umgehen, fragen Sie sich besser, ob Ihr Ziel wirklich klug ist. Ich weiß nichts über postgresql - müssen Sie wirklich mit dem Administratorkonto angemeldet sein, um das zu tun, was Sie versuchen, oder gibt es eine Möglichkeit, einem normalen Benutzerkonto schreibgeschützte Berechtigungen für alles zu erteilen, was es ist?
quelle
Warum machst du es nicht einfach so :
sudo su postgres -c "psql ..." >/path/to/file
?quelle
sudo su postgres -c "echo test"
zeigt jedoch, dass ein solcher Befehl nichts druckt. Das Wechseln zu root mitsudo -s
und das anschließende Ausführensu postgres -c "echo test"
führt einen Drucktest durch , so dass es den Anschein hat, als würdesudo
die Ausgabe irgendwie aufgefressen. Ich habe keine Ahnung warum, meine Vermutung ist dassudo
undsu -c
benutze Subshells, deren Standard nicht in meine eigene Shell gezogen wird.sudo su postgres -c "echo \$USER"
drucktpostgres
auf meiner Box.