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.
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.
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:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Możesz dodać ten wiersz poleceń na początku skryptu:
set PGPASSWORD=[your password]
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.
chmod 600
na pliku, w przeciwnym razie psql
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
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
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,
export PGPASSWORD=[password]
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 :)
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 .
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:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
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:
WARNING: password file "/dev/fd/63" is not a plain file
Opierając się na odpowiedzi mightybyte dla tych, którzy nie czują się dobrze ze skryptami powłoki * nix , oto działający skrypt:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
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ę na
psql mydb jdoe
Nie zapomnij, aby skrypt wykonywalny z
chmod +x runpsql
( lub jakkolwiek nazwałeś plik skryptu )
AKTUALIZACJA:
Wziąłem RichVel porady „s i wykonany plik nieczytelny przed uruchomieniem hasło do niego. To zamyka niewielką lukę bezpieczeństwa. Dzięki!
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 - napisanie trap
procedury obsługi powłoki rozwiązałoby ten problem. Biorąc pod uwagę, że napisanie takiego bezpiecznego skryptu nie jest trywialne, zalecamy użycie export PGPASSWORD
zamiast tego.
PGPASSWORD
zostało przestarzałe w 9.3.
Alternatywą dla używania PGPASSWORD
zmiennej środowiskowej jest użycie conninfo
łańcucha zgodnie z dokumentacją
Alternatywnym sposobem określenia parametrów połączenia jest ciąg Conninfo lub identyfikator URI, który jest używany zamiast nazwy bazy danych. Ten mechanizm zapewnia bardzo szeroką kontrolę nad połączeniem.
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
Może się to przydać: Wiersz polecenia Windows PSQL: czy istnieje sposób na logowanie bez hasła?
8 lat później ...
Na moim komputerze Mac musiałem wstawić wiersz do pliku,
~/.pgpass
taki jak:
<IP>:<PORT>:<dbname>:<user>:<password>
Zobacz także:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
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.