Jak określić hasło do „psql” nieinteraktywnie?

337

Próbuję zautomatyzować proces tworzenia bazy danych za pomocą skryptu powłoki i jedną z rzeczy jest to, że natrafiłem na przeszkodę, przekazując hasło do psql . Oto trochę kodu ze skryptu powłoki:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

Jak przekazać hasło psqlw sposób nieinteraktywny?

Alex N.
źródło
1
Możesz użyć adresu URL połączenia. Sprawdź te odpowiedzi w stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani,

Odpowiedzi:

141

Z oficjalnej dokumentacji :

Wygodne jest także posiadanie pliku ~ / .pgpass, aby uniknąć regularnego wpisywania haseł. Więcej informacji znajduje się w sekcji 30.13 .

...

Ten plik powinien zawierać wiersze o następującym formacie:

hostname:port:database:username:password

Zostanie użyte pole hasła z pierwszego wiersza, które odpowiada bieżącym parametrom połączenia.

Flimzy
źródło
29
Dzięki, jestem świadomy pgpass, ale to nie rozwiązuje problemu - potrzebuję samodzielnego skryptu bash do obsługi bazy danych, stąd moje pytanie dotyczące przekazywania informacji do psql za pomocą wiersza poleceń.
Alex N.
6
Myślę, że twoją jedyną opcją jest skonfigurowanie pliku .pgpass, do którego ma dostęp twój skrypt bash. W ogóle nie używaj haseł - możesz skonfigurować inną formę uwierzytelnienia, na przykład ident, lub użyć certyfikatów SSL.
Flimzy,
Tego się obawiałem :) Dzięki za informację!
Alex N.
Inną opcją może być oczekiwanie. Ale naprawdę nienawidzę oczekiwać :)
Flimzy,
1
Nie zapomnij usunąć uprawnień grupy i innych użytkowników do odczytu, zapisu, uruchamiania pliku .pgpass! Biegchmod go-rwx .pgpass
Vladislavs Dovgalecs
611

Przed wywołaniem psql ustaw zmienną środowiskową PGPASSWORD w skrypcie

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

W celach informacyjnych patrz http://www.postgresql.org/docs/current/static/libpq-envars.html


Edytować

Od wersji Postgres 9.2 istnieje również możliwość określenia ciągu połączenia lub identyfikatora URI, który może zawierać nazwę użytkownika i hasło.

Korzystanie z tego jest zagrożeniem bezpieczeństwa, ponieważ hasło jest widoczne w postaci zwykłego tekstu, gdy patrzy się na wiersz poleceń uruchomionego procesu, np. Podczas używania ps (Linux), ProcessExplorer (Windows) lub podobnych narzędzi, przez innych użytkowników.

Zobacz także to pytanie na temat administratorów baz danych

koń bez imienia
źródło
32
Na przykład w jednym wierszu możesz zrobić coś takiego: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb 12.09.13
3
Myślę, że jest to najwygodniejszy sposób na proste uruchomienie skryptu SQL.
zr870
2
Mogę tylko dodać - dodaj spacew wierszu polecenia przed pierwszym znakiem, a polecenie nie zostanie zapisane w historii bash. Działa z Ubuntu / Bash.
baldr
5
BONUS: Działa dla Dockera:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil
3
Zachowaj ostrożność i pamiętaj, aby zawsze dodać poprzednią spację, w przeciwnym razie pojawi się ona w Twojej historii bash ~ / .bash_history ...
rogerdpack
102
  • w jednej linii:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    z poleceniem polecenie sql, takie jak"select * from schema.table"

  • lub bardziej czytelny:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")
użytkownik4653174
źródło
18
Jedną linię można nieco uprościć: PGPASSWORD='password' psql .... co również ma tę zaletę, że zmienna nie jest dostępna po wykonaniu polecenia.
Garrett,
3
export PGPASSWORD=YourNewPasswordpracował dla mnie nad innymi odmianami.
Mikeumus
7
export PGPASSWORDbrzmi jak naprawdę zły pomysł
hasen
1
Spowoduje to zapisanie hasła w pliku historii bash ~ / .bash_history (chyba że ostrożnie zawsze dodajesz poprzednią spację), a także wyeksportować hasło do bieżącego środowiska FWIW: |
rogerdpack,
68

Wolę przekazywać adres URL do psql :

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

Daje mi to swobodę nazywania zmiennych środowiskowych według własnego uznania i pozwala uniknąć tworzenia niepotrzebnych plików.

To wymaga libpq. Dokumentację można znaleźć tutaj .

Jacques Gaudin
źródło
czy możesz użyć czegoś takiego z pg_restore? Dzięki!
the_ccalderon
1
@ ccalderon911217 Najwyraźniej możesz: stackoverflow.com/a/28359470/1388292
Jacques Gaudin
@JacquesGaudin tak przetestowałem siebie! Dziękuję Ci!
the_ccalderon
26

W systemie Windows:

  1. Przypisz wartość do PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Uruchom polecenie: C:\>psql -d database -U user

Gotowy

Lub w jednym wierszu

set PGPASSWORD=pass&& psql -d database -U user

Zwróć uwagę na brak miejsca przed &&!

JAGJ jdfoxito
źródło
1
Próbowałem tego i to nie działało. Wciąż pytany o hasło.
antipattern
1
@antipattern Musisz -wrównież przekazać opcję .
mljrg
1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"Pracuje.
Steve Shipway
21

Można to zrobić, tworząc .pgpassplik w katalogu domowym użytkownika (Linux). .pgpass format pliku:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

Możesz również użyć dzikiej karty *zamiast szczegółów.

Powiedz, że chciałem uruchomić tmp.sqlbez pytania o hasło.

Za pomocą następującego kodu możesz w pliku * .sh

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        
Srini
źródło
11
Jaki jest sens echa „chmod 0600 $ HOME / .pgpass '”? Co powiesz na chmod 0600 $ HOME / .pgpass?
Vlad Patryshev
12

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=>
ubi
źródło
4

Dodano zawartość pg_env.sh do mojego .bashrc:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

z dodatkiem (zgodnie z sugestią użytkownika4653174)

export PGPASSWORD='password'
Obrabować
źródło