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 PGPASSWORDzmienną ś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 ~/.pgpasslub podobnego. Wprowadź informacje w następującym formacie:
hostname:port:database:username:passwordNie 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.. ~/.bashrclub podobnym.Zauważ, że jeśli masz ustawiony zestaw zmiennych PGPASSWORD = '', będzie on miał pierwszeństwo przed plikiem.
chmod 600na pliku, w przeciwnym razie psqldyskretnie 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 chmodpolecenia 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 -hmyserver , -pmyport ani -Ujdoe, 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!
mktempdo utworzenia pliku tymczasowego zamiast tworzenia własnego schematu nazewnictwa. Tworzy nowy plik tymczasowy (o nazwie podobnej /tmp/tmp.ITXUNYgiNhdo Linuxa i /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4MacOS X) i wypisuje jego nazwę na standardowe wyjście.
chmod 600po 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 trapprocedury 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 PGPASSWORDzamiast tego.
PGPASSWORDzostało przestarzałe w 9.3.
Alternatywą dla używania PGPASSWORDzmiennej ś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,
~/.pgpasstaki 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.