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?

Majid Azimi
źródło

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
koń bez imienia
źródło
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.

pdm
źródło
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  
mtoonen
źródło
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.

Dhiraj
źródło
Nie rób tego: hasło będzie widoczne na wyjściu ps -ef.
Colin 't Hart