Jak korzystać z psql bez pytania o hasło?


70

Napisałem skrypt do REINDEXindeksów w bazie danych. Oto jeden z nich:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

Problem polega na tym, że nie mogę uruchomić tego skryptu w trybie autonomicznym. psqlmonituje o hasło przy każdym uruchomieniu. Istnieją również dwa ograniczenia:

  1. Nie mogę utworzyć użytkownika w bazie danych bez hasła.

  2. Ponieważ REINDEXzamyka tabele, powinienem użyć sleep <num>między nimi REINDEX.

Czy jest jakieś automatyczne rozwiązanie?

Odpowiedzi:


110

Masz cztery opcje dotyczące hasła:

  1. ustaw zmienną środowiskową PGPASSWORD. Szczegółowe informacje można znaleźć w instrukcji:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. użyj pliku .pgpass, aby zapisać hasło. Szczegółowe informacje można znaleźć w instrukcji:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. użyj „uwierzytelnienia zaufania” dla tego konkretnego użytkownika:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. użyj identyfikatora URI połączenia, który zawiera wszystko:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532

4
Od PostgreSQL 9.1 istnieje również peermetoda uwierzytelniania dla połączeń lokalnych. Obecnie tylko dla Linuksa, BSD, OS X lub Solaris (nie Windows).
Erwin Brandstetter,

1
Uwaga na .pgpassopcję, trzeba jeszcze podać nazwę użytkownika, bazy danych i nazwę hosta (czy masz normalnie) w psqlkomendzie
Raphael

w odniesieniu do 3, musisz edytować metodę. wyjaśniono tutaj: gist.github.com/p1nox/4953113
FuzzyAmi

Łatwo używać, export PGPASSWORD="your_pw"aby przejść wersja 1
gies0r

18

Prostym przykładem PGPASSWORDbędzie coś takiego:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Mam nadzieję, że to pomoże.


4
Cześć Ian_H, dziękuję za twoje komentarze i zgadzam się z twoimi punktami. Przyjęta odpowiedź jest bardzo wyczerpująca i to rozwiązało mój problem. Powodem, dla którego podałem swoją odpowiedź na ten stary post, jest to, że nadal nie jest dla mnie proste, ponieważ uważam, że inni mogą mieć takie samo odczucie.
pdm,

Był to zdecydowanie dobry dodatek do zaakceptowanej odpowiedzi - pomocne przypomnienie, że nie musimy ustawiać na stałe zmiennych ENV.
kevlarr

1

W zależności od uprawnień konta przykład bez określenia bazy danych może się nie powieść, ponieważ uprawnienia użytkownika są sprawdzane względem bazy danych, z którą się łączysz. Lepiej jest również wyraźnie określić bazę danych.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  

0

Bardzo pomocne odpowiedzi w tym wątku. Właśnie dodam to dla Ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Spowoduje to przejście do postgres bez pytania o hasło, bez konieczności ustawiania żadnych zmiennych środowiskowych. To nie jest stałe ustawienie.


Nie rób tego: hasło będzie widoczne na wyjściu ps -ef.
Colin 't Hart
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.