Bagaimana cara menggunakan psql tanpa prompt kata sandi?

70

Saya menulis skrip ke REINDEXindeks dalam database. Ini salah satunya:

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

Masalahnya adalah saya tidak bisa menjalankan skrip ini dalam mode mandiri. psqlmeminta kata sandi setiap kali dijalankan. Ada juga dua batasan:

  1. Saya tidak dapat membuat pengguna di basis data tanpa kata sandi.

  2. Karena REINDEXmengunci tabel, saya harus menggunakan sleep <num>masing-masing REINDEX.

Apakah ada solusi otomatis?

Majid Azimi
sumber

Jawaban:

111

Anda memiliki empat pilihan mengenai prompt kata sandi:

  1. atur variabel lingkungan PGPASSWORD. Untuk detailnya lihat manual:
    http://www.postgresql.org/docs/current/static/libpq-envars.html
  2. gunakan file .pgpass untuk menyimpan kata sandi. Untuk detailnya lihat manual:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html
  3. gunakan "kepercayaan otentikasi" untuk pengguna tertentu:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. gunakan koneksi URI yang berisi segalanya:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532
seekor kuda tanpa nama
sumber
4
Sejak PostgreSQL 9.1 ada juga peermetode otentikasi untuk koneksi lokal. Saat ini hanya untuk Linux, BSD, OS X atau Solaris (bukan Windows).
Erwin Brandstetter
1
Catatan tentang .pgpassopsi ini, Anda masih harus menentukan nama pengguna, basis data, dan nama host (jika Anda akan biasanya) dalam psqlperintah
raphael
sehubungan dengan 3, Anda perlu mengedit metode ini. dijelaskan di sini: gist.github.com/p1nox/4953113
FuzzyAmi
Mudah digunakan export PGPASSWORD="your_pw"untuk membuka versi 1
gies0r
18

Contoh sederhana dengan PGPASSWORDakan menjadi sesuatu seperti:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Semoga ini bisa membantu.

pdm
sumber
4
Hai Ian_H, terima kasih atas komentar Anda dan saya semua setuju dengan poin Anda. Jawaban yang diterima sangat komprehensif dan itu memang memecahkan masalah saya. Alasan saya memberikan jawaban saya pada posting lama ini adalah karena itu masih tidak langsung bagi saya, karena saya percaya orang lain mungkin memiliki perasaan yang sama.
pdm
Ini jelas merupakan tambahan yang bagus untuk jawaban yang diterima - pengingat yang membantu bahwa kita tidak perlu mengatur vars ENV secara permanen.
kevlarr
1

Bergantung pada izin akun Anda, contoh tanpa menentukan basis data mungkin gagal, karena izin pengguna diperiksa terhadap basis data yang Anda sambungkan. Lebih baik secara eksplisit menentukan basis data juga.

# 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
sumber
0

Jawaban yang sangat membantu di utas ini. Saya hanya menambahkan ini untuk ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Ini akan membawa Anda ke postgres tanpa kata sandi, tanpa harus mengatur variabel lingkungan apa pun. Ini bukan pengaturan permanen.

Dhiraj
sumber
Jangan lakukan ini: Kata sandi akan terlihat di keluaran ps -ef.
Colin 't Hart