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.
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.
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:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Anda dapat menambahkan baris perintah ini di awal skrip Anda:
set PGPASSWORD=[your password]
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.
chmod 600
pada file, jika tidak psql
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
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
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,
export PGPASSWORD=[password]
Anda harus menyimpan ini di bagian atas file, atau sebelum penggunaan apa pun yang ditetapkan sebelum dipanggil.
Pasti bekerja di windows :)
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.
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:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
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:
WARNING: password file "/dev/fd/63" is not a plain file
Membangun jawaban mightybyte bagi mereka yang tidak nyaman dengan skrip * nix shell, berikut ini skrip yang berfungsi:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
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 menjadi
psql mydb jdoe
Jangan lupa untuk membuat script executable dengan
chmod +x runpsql
( atau apa pun yang Anda sebut file skrip )
MEMPERBARUI:
Saya mengambil saran RichVel dan membuat file tidak dapat dibaca sebelum memasukkan kata sandi ke dalamnya. Itu menutup sedikit lubang keamanan. Terima kasih!
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 - menulis trap
penangan shell akan membahas ini. Mengingat tidak mudah untuk membuat skrip yang aman seperti ini, saya sarankan untuk menggunakannya export PGPASSWORD
.
PGPASSWORD
telah usang dalam 9.3.
Alternatif untuk menggunakan PGPASSWORD
variabel lingkungan adalah menggunakan conninfo
string 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=>
Anda mungkin menemukan ini berguna: baris perintah Windows PSQL: apakah ada cara untuk memungkinkan masuk tanpa kata sandi?
8 tahun kemudian ...
Di mac saya, saya harus meletakkan baris ke dalam file
~/.pgpass
seperti:
<IP>:<PORT>:<dbname>:<user>:<password>
Lihat juga:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
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.