Was ist der Unterschied zwischen sudo su - postgres und sudo -u postgres?

36

PostgreSQL-Benutzer führen standardmäßig eine Peer-Authentifizierung auf Unix-Sockets durch, wobei der Unix-Benutzer mit dem PostgreSQL-Benutzer identisch sein muss. So nutzen suoder sudowerden Menschen häufig zum postgresSuperuser.

Ich sehe oft Leute, die Konstrukte verwenden wie:

sudo su - postgres

eher, als

sudo -u postgres -i

und ich frage mich warum. Ebenso habe ich gesehen:

sudo su - postgres -c psql

anstatt

sudo -u postgres psql

Ohne die Führung würden sudodie suVersionen einen Sinn ergeben, wenn Sie auf einer alten Plattform ohne wären sudo. Aber warum würden Sie auf einem weniger als prähisorischen UNIX oder Linux verwenden sudo su?

Craig Ringer
quelle
Verwandte auf Schwester-Website, DBA Stack Exchange: Benutzer auf 'postgres' Benutzer auf MacOS wechseln führt zu "su: Sorry" Fehler
Basil Bourque

Antworten:

40

Vergessen sudo su

Der Gebrauch sudo suhat keinen Vorteil , er ist eine anachronistische Angewohnheit aus der Zeit, als die Menschen an den Gebrauch gewöhnt waren su. Die Leute gingen sudovoran, als Linux-Distributionen aufhörten, ein Root-Passwort festzulegen, und sudonur so auf das Root-Konto zugreifen konnten. Anstatt ihre Gewohnheiten zu ändern, benutzten sie nur sudo su. (Ich war einer von ihnen bis vor relativ kurzer Zeit, als sudoersich Boxen mit Configs verwendete, die mich dazu zwangen, meine Gewohnheit zu ändern).

Verwenden sudo -u

Für eine Login-Shell sudo -u postgres -iist vorzuziehen sudo su - postgres. Es ist nicht erforderlich, dass der Benutzer über Root-Zugriff verfügt /etc/sudoers, sondern nur das Recht, Benutzer zu werden postgres. Sie können damit auch bessere Zugriffskontrollen erzwingen.

Zur Befehlsausführung

sudo -u postgres psql -c "SELECT 1"

ist der Alternative überlegen:

sudo su - postgres -c "psql -c \"SELECT 1\""

Sie müssen Anführungszeichen und andere Shell-Metazeichen sowie die anderen Sicherheitsvorteile, die sich daraus ergeben, dass Sie keinen Root benötigen, nicht doppelt maskieren. Sie werden wahrscheinlich versehentlich beim Schreiben landen:

sudo su - postgres -c psql -c "SELECT 1"

manchmal, was nicht richtig funktioniert.

Schließlich ist es viel einfacher, Umgebungsvariablen festzulegen sudo, z

sudo PATH=/usr/pgsql-9.3/bin:$PATH -u postgres /usr/pgsql-9.3/bin/initdb -D /var/lib/pgsql/testcluster

als über su. (Hier ist die PATHEinstellung erforderlich, damit initdbdie richtige postgresausführbare Datei gefunden werden kann).

So. Vergiss, dass der suBefehl existiert. Du brauchst es nicht mehr. Um die Gewohnheit zu brechen, geben Sie einen Alias ​​an, der einen Fehler ausgibt. (Einige Init- und Package-Setup-Skripte werden weiterhin verwendet, susodass Sie sie jedoch nicht entfernen können.)

Siehe auch:

Craig Ringer
quelle