Bagaimana saya bisa memanggil psql sehingga tidak meminta kata sandi ?
Inilah yang saya miliki:
psql -Umyuser < myscript.sql
Namun, saya tidak dapat menemukan argumen yang melewati kata sandi, dan karenanya psql selalu memintanya.
postgresql
psql
Axel Fontaine
sumber
sumber
Jawaban:
Ada beberapa cara untuk mengautentikasi ke PostgreSQL. Anda mungkin ingin menyelidiki alternatif untuk otentikasi kata sandi di https://www.postgresql.org/docs/current/static/client-authentication.html .
Untuk menjawab pertanyaan Anda, ada beberapa cara memberikan kata sandi untuk otentikasi berbasis kata sandi. Cara yang jelas adalah melalui prompt kata sandi. Alih-alih itu, Anda dapat memberikan kata sandi dalam file pgpass atau melalui
PGPASSWORD
variabel lingkungan. Lihat ini:Tidak ada opsi untuk memberikan kata sandi sebagai argumen baris perintah karena informasi itu sering tersedia untuk semua pengguna, dan karenanya tidak aman. Namun, di lingkungan Linux / Unix Anda dapat memberikan variabel lingkungan untuk satu perintah seperti ini:
sumber
sumber
Anda dapat menambahkan baris perintah ini di awal skrip Anda:
sumber
export PGPASSWORD=[password]
berhasil#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=password
.Jika Anda berniat memiliki banyak koneksi host / basis data, file ~ / .pgpass adalah cara yang harus dilakukan.
Langkah:
vim ~/.pgpass
atau serupa. Masukkan informasi Anda dalam format berikut:hostname:port:database:username:password
Jangan tambahkan kutipan string di sekitar nilai bidang Anda. Anda juga dapat menggunakan * sebagai wildcard untuk bidang port / database Anda.chmod 0600 ~/.pgpass
agar itu tidak diabaikan secara diam-diam oleh psql.alias postygresy='psql --host hostname database_name -U username'
Nilai harus sesuai dengan yang Anda masukkan ke file ~ / .pgpass.. ~/.bashrc
atau serupa.Perhatikan bahwa jika Anda memiliki set variabel PGPASSWORD = '' ekspor, itu akan diutamakan di atas file.
sumber
chmod 600
pada file, jika tidakpsql
diam-diam akan mengabaikannya (menurut dokumen).Ini mungkin pertanyaan lama, tetapi ada metode alternatif yang dapat Anda gunakan yang belum disebutkan oleh siapa pun. Dimungkinkan untuk menentukan kata sandi secara langsung dalam koneksi URI. Dokumentasi dapat ditemukan di sini , atau di sini .
Anda dapat memberikan nama pengguna dan kata sandi Anda secara langsung dalam koneksi yang disediakan URI untuk
psql
:sumber
PGPASSWORD
Jika Anda mengalami masalah di windows seperti saya (saya menggunakan Windows 7 64-bit) dan
set PGPASSWORD=[Password]
tidak berfungsi.Kemudian, seperti yang dikatakan Kavaklioglu di salah satu komentar,
Anda harus menyimpan ini di bagian atas file, atau sebelum penggunaan apa pun yang ditetapkan sebelum dipanggil.
Pasti bekerja di windows :)
sumber
export PGPASSWORD=[password]
tidak berfungsi untuk saya menggunakan baris perintah (cmd.exe) sama sekali. Apakah Anda yakin tidak menggunakan cygwin atau yang serupa?Anda harus membuat file kata sandi: lihat http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html untuk info lebih lanjut.
sumber
Mengingat masalah keamanan tentang penggunaan variabel lingkungan PGPASSWORD, saya pikir solusi keseluruhan terbaik adalah sebagai berikut:
Ada beberapa poin yang perlu diperhatikan di sini. Langkah 1 ada untuk menghindari mucking dengan file ~ / .pgpass pengguna yang mungkin ada. Anda juga harus memastikan bahwa file tersebut memiliki izin 0600 atau kurang.
Beberapa orang menyarankan memanfaatkan bash untuk pintas ini sebagai berikut:
Ini menggunakan sintaks <() untuk menghindari keharusan menulis data ke file yang sebenarnya. Tapi itu tidak berhasil karena psql memeriksa file apa yang sedang digunakan dan akan menimbulkan kesalahan seperti ini:
sumber
Ini bisa dilakukan hanya dengan menggunakan PGPASSWORD. Saya menggunakan psql 9.5.10. Dalam kasus Anda solusinya adalah
PGPASSWORD=password psql -U myuser < myscript.sql
sumber
Membangun jawaban mightybyte bagi mereka yang tidak nyaman dengan skrip * nix shell, berikut ini skrip yang berfungsi:
Tanda dolar ganda (
$$
)/tmp/pgpasswd$$
pada baris 2 menambahkan nomor ID proses ke nama file, sehingga skrip ini dapat dijalankan lebih dari sekali, bahkan secara bersamaan, tanpa efek samping.Perhatikan penggunaan
chmod
perintah pada baris 4 - seperti halnya kesalahan " bukan file biasa " yang mungkin dijelaskan, ada juga kesalahan " izin " jika ini tidak dilakukan.Pada baris 7, Anda tidak perlu menggunakan server
-h
myserver ,-p
myport , atau-U
jdoe jika Anda menggunakan default ( localhost : 5432 ) dan hanya memiliki satu pengguna basis data. Untuk banyak pengguna, (tetapi koneksi default) ubah baris itu menjadiJangan lupa untuk membuat script executable dengan
MEMPERBARUI:
Saya mengambil saran RichVel dan membuat file tidak dapat dibaca sebelum memasukkan kata sandi ke dalamnya. Itu menutup sedikit lubang keamanan. Terima kasih!
sumber
mktemp
untuk membuat file sementara alih-alih membuat skema penamaan Anda sendiri. Itu menciptakan file temp baru (bernama sesuatu seperti/tmp/tmp.ITXUNYgiNh
di Linux dan/var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
di MacOS X) dan mencetak namanya ke stdout.chmod 600
setelah membuat file, tetapi sebelum menulis kata sandi. Seperti yang ditulis, skrip berbahaya di server dapat terus mencoba membaca file format ini, dan kadang-kadang berhasil mendapatkan kata sandi. Juga, jika skrip ini terganggu karena beberapa alasan, file tersebut akan dibiarkan di disk - menulistrap
penangan shell akan membahas ini. Mengingat tidak mudah untuk membuat skrip yang aman seperti ini, saya sarankan untuk menggunakannyaexport PGPASSWORD
.PGPASSWORD
telah usang dalam 9.3.Alternatif untuk menggunakan
PGPASSWORD
variabel lingkungan adalah menggunakanconninfo
string sesuai dengan dokumentasisumber
Anda mungkin menemukan ini berguna: baris perintah Windows PSQL: apakah ada cara untuk memungkinkan masuk tanpa kata sandi?
sumber
8 tahun kemudian ...
Di mac saya, saya harus meletakkan baris ke dalam file
~/.pgpass
seperti:Lihat juga:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
sumber
Saya menemukan, psql menampilkan prompt kata sandi bahkan ketika Anda mendefinisikan variabel PGPASSWORD, tetapi Anda dapat menentukan opsi -w untuk psql untuk menghilangkan prompt kata sandi.
sumber
Gunakan -w pada perintah: psql -h localhost -p 5432 -U pengguna -w
sumber