Jaka jest różnica między sudo su - postgres a sudo -u postgres?

36

Użytkownicy PostgreSQL domyślnie uwierzytelniają peer na gniazdach unix, gdzie użytkownik unix musi być taki sam jak użytkownik PostgreSQL. Więc ludzie często używają sulub sudostają się postgressuperużytkownikami.

Często widzę ludzi używających konstrukcji takich jak:

sudo su - postgres

zamiast

sudo -u postgres -i

i zastanawiam się dlaczego. Podobnie widziałem:

sudo su - postgres -c psql

zamiast

sudo -u postgres psql

Bez czołowych sudow suwersjach będzie jakiś sens, jeśli były na starej platformie bez sudo. Ale dlaczego miałbyś używać systemu UNIX lub Linux mniej niż prehisoryczny sudo su?

Craig Ringer
źródło
Powiązane na siostrzanej stronie, DBA Stack Exchange: Przełącz użytkownika na użytkownika „postgres” w systemie macOS w wyniku błędu „su: Sorry”
Basil Bourque

Odpowiedzi:

40

Zapomnieć sudo su

Nie ma żadnych korzyści z używania sudo su, jest to anachroniczny nawyk, od kiedy ludzie byli przyzwyczajeni do używania su. Ludzie zaczęli halsować sudoz przodu, gdy dystrybucje Linuksa przestały ustawiać hasło roota i stworzyły sudojedyny sposób dostępu do konta roota. Zamiast zmieniać swoje przyzwyczajenia, po prostu wykorzystali sudo su. (Byłem jednym z nich do niedawna, kiedy używanie pudełek z sudoerskonfiguracjami zmusiło mnie do zmiany nawyku).

Posługiwać się sudo -u

sudo -u postgres -iPreferowana jest powłoka logowania sudo su - postgres. Nie wymaga, aby użytkownik miał dostęp do konta root /etc/sudoers, wystarczy jedynie prawo do zostania użytkownikiem postgres. Pozwala także wymusić lepszą kontrolę dostępu.

Do wykonania polecenia

sudo -u postgres psql -c "SELECT 1"

jest lepszy od alternatywy:

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

w tym, że nie musisz podwójnie usuwać cudzysłowów i innych metaznaków powłoki, a także innych zalet bezpieczeństwa, które nie wymagają rootowania. Prawdopodobnie przypadkowo wylądujesz pisząc:

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

czasami, co nie działa poprawnie.

Wreszcie, znacznie łatwiej jest ustawić zmienne środowiskowe sudo, np

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

niż przez su. (Tutaj PATHustawienie jest wymagane, aby initdbmożna było znaleźć prawidłowy postgresplik wykonywalny).

Więc. Zapomnij, że supolecenie istnieje. Już go nie potrzebujesz. Aby zerwać z nałogiem, użyj aliasu na coś, co wydrukuje błąd. (Niektóre skrypty inicjujące i instalacyjne pakietu nadal używają, suwięc nie można go usunąć).

Zobacz też:

Craig Ringer
źródło