Jak mogę wywołać psql, aby nie monitował o hasło ?
Oto co mam:
psql -Umyuser < myscript.sql
Jednak nie mogłem znaleźć argumentu, który przekazuje hasło, dlatego psql zawsze go prosi.
postgresql
psql
Axel Fontaine
źródło
źródło
Odpowiedzi:
Istnieje kilka sposobów uwierzytelnienia w PostgreSQL. Możesz sprawdzić alternatywne sposoby uwierzytelniania za pomocą hasła na stronie https://www.postgresql.org/docs/current/static/client-authentication.html .
Aby odpowiedzieć na twoje pytanie, istnieje kilka sposobów podania hasła do uwierzytelnienia opartego na haśle. Oczywistym sposobem jest podanie hasła. Zamiast tego możesz podać hasło w pliku pgpass lub poprzez
PGPASSWORD
zmienną środowiskową. Zobacz te:Nie ma opcji podania hasła jako argumentu wiersza poleceń, ponieważ informacje te są często dostępne dla wszystkich użytkowników, a zatem niepewne. Jednak w środowiskach Linux / Unix możesz podać zmienną środowiskową dla jednego polecenia, takiego jak to:
źródło
źródło
Możesz dodać ten wiersz poleceń na początku skryptu:
źródło
export PGPASSWORD=[password]
działało#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=password
.Jeśli zamierzasz mieć wiele połączeń host / baza danych, najlepszym rozwiązaniem jest plik ~ / .pgpass .
Kroki:
vim ~/.pgpass
lub podobnego. Wprowadź informacje w następującym formacie:hostname:port:database:username:password
Nie dodawaj cudzysłowów ciągowych wokół wartości pól. Możesz także użyć * jako symbolu wieloznacznego dla pól portu / bazy danych.chmod 0600 ~/.pgpass
, aby psql nie ignorował go po cichu.alias postygresy='psql --host hostname database_name -U username'
Wartości powinny być zgodne z wartościami wprowadzonymi do pliku ~ / .pgpass.. ~/.bashrc
lub podobnym.Zauważ, że jeśli masz ustawiony zestaw zmiennych PGPASSWORD = '', będzie on miał pierwszeństwo przed plikiem.
źródło
chmod 600
na pliku, w przeciwnym raziepsql
dyskretnie go zignoruje (zgodnie z dokumentami).To może być stare pytanie, ale istnieje alternatywna metoda, której można użyć, o której nikt nie wspomniał. Możliwe jest określenie hasła bezpośrednio w URI połączenia. Dokumentację można znaleźć tutaj lub alternatywnie tutaj .
Możesz podać swoją nazwę użytkownika i hasło bezpośrednio w identyfikatorze URI połączenia podanym w celu
psql
:źródło
PGPASSWORD
Jeśli masz problemy w systemie Windows takim jak ja (używam 64-bitowego systemu Windows 7) i
set PGPASSWORD=[Password]
nie działało.Następnie, jak powiedział Kavaklioglu w jednym z komentarzy,
Będziesz musiał zapisać to na górze pliku lub przed użyciem, więc ustaw go przed wywołaniem.
Z pewnością działa na systemie Windows :)
źródło
export PGPASSWORD=[password]
w ogóle nie działa przy użyciu wiersza polecenia (cmd.exe). Czy na pewno nie używasz cygwina lub czegoś podobnego?Musisz utworzyć plik hasła: więcej informacji można znaleźć na stronie http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html .
źródło
Biorąc pod uwagę obawy dotyczące bezpieczeństwa związane ze stosowaniem zmiennej środowiskowej PGPASSWORD, myślę, że najlepsze ogólne rozwiązanie jest następujące:
Jest tu kilka ważnych punktów. Krok 1 ma na celu uniknięcie zmarnowania pliku ~ / .pgpass użytkownika, który może istnieć. Musisz także upewnić się, że plik ma uprawnienia 0600 lub niższe.
Niektórzy sugerują użycie bash do skrótu w następujący sposób:
Korzysta ze składni <(), aby uniknąć konieczności zapisywania danych w rzeczywistym pliku. Ale to nie działa, ponieważ psql sprawdza, który plik jest używany i zgłasza taki błąd:
źródło
Można to zrobić po prostu za pomocą PGPASSWORD. Używam psql 9.5.10. W twoim przypadku rozwiązaniem byłoby
PGPASSWORD=password psql -U myuser < myscript.sql
źródło
Opierając się na odpowiedzi mightybyte dla tych, którzy nie czują się dobrze ze skryptami powłoki * nix , oto działający skrypt:
Podwójny znak dolara (
$$
) w/tmp/pgpasswd$$
wierszu 2 dołącza numer identyfikacyjny procesu do nazwy pliku, dzięki czemu skrypt może być uruchamiany więcej niż jeden raz, nawet jednocześnie, bez skutków ubocznych.Zwróć uwagę na użycie
chmod
polecenia w wierszu 4 - podobnie jak opisany przez mightybyte błąd „ zwykły plik ” , istnieje również błąd „ uprawnień ”, jeśli nie zostanie to zrobione.W linii 7 nie musisz używać flagi
-h
myserver ,-p
myport ani-U
jdoe, jeśli używasz wartości domyślnych ( localhost : 5432 ) i masz tylko jednego użytkownika bazy danych. W przypadku wielu użytkowników (ale domyślne połączenie) zmień tę linię naNie zapomnij, aby skrypt wykonywalny z
AKTUALIZACJA:
Wziąłem RichVel porady „s i wykonany plik nieczytelny przed uruchomieniem hasło do niego. To zamyka niewielką lukę bezpieczeństwa. Dzięki!
źródło
mktemp
do utworzenia pliku tymczasowego zamiast tworzenia własnego schematu nazewnictwa. Tworzy nowy plik tymczasowy (o nazwie podobnej/tmp/tmp.ITXUNYgiNh
do Linuxa i/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
MacOS X) i wypisuje jego nazwę na standardowe wyjście.chmod 600
po utworzeniu pliku, ale przed zapisaniem hasła do niego. Jak napisano, złośliwy skrypt na serwerze może nieustannie próbować czytać pliki tego formatu, a czasem może uzyskać hasło. Ponadto, jeśli ten skrypt zostanie z jakiegoś powodu przerwany, plik zostałby pozostawiony na dysku - napisanietrap
procedury obsługi powłoki rozwiązałoby ten problem. Biorąc pod uwagę, że napisanie takiego bezpiecznego skryptu nie jest trywialne, zalecamy użycieexport PGPASSWORD
zamiast tego.PGPASSWORD
zostało przestarzałe w 9.3.Alternatywą dla używania
PGPASSWORD
zmiennej środowiskowej jest użycieconninfo
łańcucha zgodnie z dokumentacjąźródło
Może się to przydać: Wiersz polecenia Windows PSQL: czy istnieje sposób na logowanie bez hasła?
źródło
8 lat później ...
Na moim komputerze Mac musiałem wstawić wiersz do pliku,
~/.pgpass
taki jak:Zobacz także:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
źródło
Uważam, że psql wyświetla monit o podanie hasła, nawet jeśli zdefiniujesz zmienną PGPASSWORD, ale możesz podać opcję -w, aby psql pomijał monit o podanie hasła.
źródło
Użyj -w w poleceniu: psql -h localhost -p 5432 -U użytkownik -w
źródło