Bagaimana cara menentukan kata sandi untuk 'psql' secara non-interaktif?

337

Saya mencoba untuk mengotomatiskan proses pembuatan basis data dengan skrip shell dan satu hal yang saya temukan di blok jalan dengan meneruskan kata sandi ke psql . Berikut ini sedikit kode dari skrip shell:

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

Bagaimana saya meneruskan kata sandi dengan psqlcara yang tidak interaktif?

Alex N.
sumber
1
Anda dapat menggunakan url koneksi. Periksa jawaban ini di stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani

Jawaban:

141

Dari dokumentasi resmi :

Juga nyaman untuk memiliki file ~ / .pgpass untuk menghindari secara teratur harus mengetikkan kata sandi. Lihat Bagian 30.13 untuk informasi lebih lanjut.

...

File ini harus berisi baris dengan format berikut:

hostname:port:database:username:password

Kolom kata sandi dari baris pertama yang cocok dengan parameter koneksi saat ini akan digunakan.

Flimzy
sumber
29
Terima kasih, saya mengetahui pgpass, tetapi ini tidak menyelesaikan masalah - Saya perlu skrip bash mandiri untuk beroperasi di database, maka pertanyaan saya tentang meneruskan info ke psql melalui baris perintah.
Alex N.
6
Saya pikir satu-satunya pilihan Anda adalah menyiapkan file .pgpass yang dapat diakses oleh skrip bash Anda. Atau jangan gunakan kata sandi sama sekali - Anda dapat mengatur bentuk otentikasi lain, seperti ident, atau menggunakan sertifikat SSL.
Flimzy
Itulah yang saya takutkan :) Terima kasih atas informasinya!
Alex N.
Pilihan lain mungkin menggunakan ekspektasi. Tapi aku benar-benar benci berharap :)
Flimzy
1
Jangan lupa untuk menghapus grup dan izin pengguna lain untuk membaca, menulis, mengeksekusi file .pgpass! Jalankanchmod go-rwx .pgpass
Vladislavs Dovgalecs
611

Setel variabel lingkungan PGPASSWORD di dalam skrip sebelum memanggil psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Untuk referensi, lihat http://www.postgresql.org/docs/current/static/libpq-envars.html


Edit

Sejak Postgres 9.2 ada juga opsi untuk menentukan string koneksi atau URI yang dapat berisi nama pengguna dan kata sandi.

Menggunakan itu adalah risiko keamanan karena kata sandi terlihat dalam teks biasa ketika melihat baris perintah dari proses yang berjalan misalnya menggunakan ps (Linux), ProcessExplorer (Windows) atau alat serupa, oleh pengguna lain.

Lihat juga pertanyaan ini tentang Administrator Database

seekor kuda tanpa nama
sumber
32
Misalnya dalam satu baris Anda dapat melakukan sesuatu seperti: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb
3
Saya pikir ini adalah cara paling mudah untuk menjalankan skrip SQL.
zr870
2
Saya hanya bisa menambahkan - menambahkan spacedi baris perintah sebelum karakter pertama dan perintah tidak akan disimpan dalam bash history. Bekerja untuk ubuntu / bash.
baldr
5
BONUS: Bekerja untuk Docker:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil
3
Hati-hati dan pastikan untuk selalu menambahkan ruang sebelumnya jika tidak akan muncul dalam bash history Anda ~ / .bash_history file ...
rogerdpack
102
  • dalam satu baris:

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

    dengan perintah perintah sql seperti"select * from schema.table"

  • atau lebih mudah dibaca:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")
pengguna4653174
sumber
18
Satu baris dapat sedikit disederhanakan menjadi: PGPASSWORD='password' psql .... yang juga memiliki manfaat dari variabel yang tidak dapat diakses setelah perintah selesai.
Garrett
3
export PGPASSWORD=YourNewPasswordbekerja untuk saya atas variasi lain.
Mikeumus
7
export PGPASSWORDterdengar seperti ide yang sangat buruk
hasen
1
Ini akan menyimpan kata sandi di file bash history ~ / .bash_history Anda (kecuali Anda dengan hati-hati selalu menambahkan ruang sebelumnya), dan juga mengekspor kata sandi ke lingkungan Anda saat ini FWIW: |
rogerdpack
68

Saya cenderung lebih suka meneruskan URL ke psql :

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

Ini memberi saya kebebasan untuk memberi nama variabel lingkungan saya seperti yang saya inginkan dan menghindari membuat file yang tidak perlu.

Ini membutuhkan libpq. Dokumentasi dapat ditemukan di sini .

Jacques Gaudin
sumber
dapatkah Anda menggunakan sesuatu seperti ini dengan pg_restore? Terima kasih!
the_ccalderon
1
@ ccalderon911217 Rupanya Anda dapat: stackoverflow.com/a/28359470/1388292
Jacques Gaudin
@ JacquesGaudin ya menguji sendiri! Terima kasih!
the_ccalderon
26

Di Windows:

  1. Tetapkan nilai untuk PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Jalankan perintah: C:\>psql -d database -U user

Siap

Atau dalam satu baris,

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

Perhatikan kurangnya ruang sebelum &&!

JAGJ jdfoxito
sumber
1
Saya mencobanya, dan itu tidak berhasil. Masih dimintai kata sandi.
antipattern
1
@antipattern Anda juga harus melewati opsi -w.
mljrg
1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"bekerja.
Steve Shipway
21

Ini dapat dilakukan dengan membuat .pgpassfile di direktori home Pengguna (Linux). .pgpass format file:

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

Anda juga dapat menggunakan wild card *sebagai ganti detail.

Katakanlah saya ingin menjalankan tmp.sqltanpa meminta kata sandi.

Dengan kode berikut Anda dapat dalam file * .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
sumber
11
Apa gunanya gema "` chmod 0600 $ HOME / .pgpass `"? Bagaimana kalau hanya chmod 0600 $ HOME / .pgpass?
Vlad Patryshev
12

Alternatif untuk menggunakan PGPASSWORDvariabel lingkungan adalah dengan menggunakan conninfostring sesuai dengan dokumentasi :

Cara alternatif untuk menentukan parameter koneksi adalah dalam string conninfo atau URI, yang digunakan sebagai ganti nama database. Mekanisme ini memberi Anda kendali yang sangat luas atas koneksi.

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>
ubi
sumber
4

Menambahkan konten pg_env.sh ke .bashrc saya:

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

dengan penambahan (sesuai saran pengguna4653174)

export PGPASSWORD='password'
rampok
sumber