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 psql
w sposób nieinteraktywny?
bash
postgresql
command-line
Alex N.
źródło
źródło
Odpowiedzi:
Z oficjalnej dokumentacji :
...
źródło
chmod go-rwx .pgpass
Przed wywołaniem psql ustaw zmienną środowiskową PGPASSWORD w skrypcie
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
źródło
space
w wierszu polecenia przed pierwszym znakiem, a polecenie nie zostanie zapisane w historii bash. Działa z Ubuntu / Bash.docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
w jednej linii:
z poleceniem polecenie sql, takie jak
"select * from schema.table"
lub bardziej czytelny:
źródło
PGPASSWORD='password' psql ....
co również ma tę zaletę, że zmienna nie jest dostępna po wykonaniu polecenia.export PGPASSWORD=YourNewPassword
pracował dla mnie nad innymi odmianami.export PGPASSWORD
brzmi jak naprawdę zły pomysłWolę przekazywać adres URL do psql :
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 .źródło
W systemie Windows:
Przypisz wartość do PGPASSWORD:
C:\>set PGPASSWORD=pass
Uruchom polecenie:
C:\>psql -d database -U user
Gotowy
Lub w jednym wierszu
Zwróć uwagę na brak miejsca przed &&!
źródło
-w
również przekazać opcję .PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"
Pracuje.Można to zrobić, tworząc
.pgpass
plik w katalogu domowym użytkownika (Linux)..pgpass
format pliku:Możesz również użyć dzikiej karty
*
zamiast szczegółów.Powiedz, że chciałem uruchomić
tmp.sql
bez pytania o hasło.Za pomocą następującego kodu możesz w pliku * .sh
źródło
Alternatywą dla używania
PGPASSWORD
zmiennej środowiskowej jest użycieconninfo
łańcucha zgodnie z dokumentacją :źródło
Dodano zawartość pg_env.sh do mojego .bashrc:
z dodatkiem (zgodnie z sugestią użytkownika4653174)
źródło