Etkileşimli olmayan bir şekilde 'psql' şifresini nasıl belirleyebilirim?


337

Bir kabuk komut dosyası ile veritabanı oluşturma işlemini otomatikleştirmeye çalışıyorum ve psql için bir parola geçirerek bir yol bloğunu vurdum . Kabuk betiğinden kod biraz:

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

Bir şifreyi psqletkileşimli olmayan bir şekilde nasıl aktarabilirim ?


1
Bir bağlantı URL'si kullanabilirsiniz. Bu cevapları stackoverflow.com/questions/3582552/postgres-connection-url adresinde kontrol edin .
paulodiovani

Yanıtlar:


141

Gönderen Resmi belgelerin :

Düzenli olarak parola yazmak zorunda kalmamak için ~ / .pgpass dosyasına sahip olmak da uygundur. Daha fazla bilgi için Bölüm 30.13'e bakınız .

...

Bu dosya aşağıdaki biçimde satırlar içermelidir:

hostname:port:database:username:password

İlk satırdaki geçerli bağlantı parametreleriyle eşleşen parola alanı kullanılacaktır.


29
Teşekkürler, pgpass'ın farkındayım, ancak bu sorunu çözmüyor - veritabanı üzerinde çalışmak için bağımsız bir bash betiğine ihtiyacım var, bu nedenle komut satırından psql'ye bilgi aktarmayla ilgili sorum var.
Alex N.

6
Bence tek seçeneğiniz, bash betiğinizin erişebileceği bir .pgpass dosyası kurmaktır. Veya şifreleri hiç kullanmayın - ident veya SSL sertifikaları gibi başka bir kimlik doğrulama biçimi ayarlayabilirsiniz.
Çürük

Korktuğum şey bu :) Bilgi için teşekkürler!
Alex N.

Başka bir seçenek de beklemeyi kullanmak olabilir. Ama gerçekten beklemekten nefret ediyorum :)
Flimzy

1
.Pgpass dosyasını okumak, yazmak, yürütmek için grup ve diğer kullanıcı iznini kaldırmayı unutmayın! Koşchmod go-rwx .pgpass
Vladislavs Dovgalecs

611

Psql çağırmadan önce komut dosyasının içindeki PGPASSWORD ortam değişkenini ayarlayın

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Referans için bkz. Http://www.postgresql.org/docs/current/static/libpq-envars.html


Düzenle

Postgres 9.2'den beri , kullanıcı adı ve parolayı içerebilecek bir bağlantı dizesi veya URI belirtme seçeneği de vardır .

Çalışan bir işlemin komut satırına bakarken ps(Linux), ProcessExplorer (Windows) veya benzeri araçları kullanarak parola düz metin olarak görülebildiğinden, bunu kullanmak bir güvenlik riskidir .

Ayrıca Veritabanı Yöneticileri hakkındaki bu soruya bakın


32
Örneğin, bir satırda aşağıdakine benzer bir şey yapabilirsiniz: PGPASSWORD = pass1234 psql -u KullanıcıAdım myUserName
andyortlieb 12:03

3
Bu sadece bir SQL komut dosyası çalıştırmak için en uygun yol olduğunu düşünüyorum.
zr870

2
Sadece spaceilk karakterden önce komut satırına bir ekleme ekleyebilirim - ve komut bash geçmişinde saklanmaz. Ubuntu / bash için çalışır.
baldr

5
BONUS: Docker için çalışıyor:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil

3
Dikkatli olun ve her zaman bir önceki boşluk eklediğinizden emin olun, aksi takdirde bash geçmişinizde
görünecektir

102
  • bir satırda:

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

    ile , komut , bir SQL komutu gibi"select * from schema.table"

  • veya daha fazla okunabilir:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")

18
Bir satır hafifçe basitleştirilebilir: PGPASSWORD='password' psql .... bu, komutun tamamlanmasından sonra değişkenin erişilememesi avantajına da sahiptir.
Garrett

3
export PGPASSWORD=YourNewPasswordbenim için diğer varyasyonlar üzerinde çalıştı.
Mikeumus

7
export PGPASSWORDgerçekten kötü bir fikir gibi geliyor
hasen

1
Bu işlem parolayı bash ~ ~ .bash_history dosyanıza kaydeder (her zaman dikkatlice bir önceki boşluk eklemezseniz) ve aynı zamanda parolanızı geçerli ortamınıza dışa aktarır FWIW: |
rogerdpack

68

Ben psql bir URL geçirme tercih eğilimindedir :

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

Bu bana ortam değişkenlerimi dilediğim gibi adlandırma özgürlüğü veriyor ve gereksiz dosyalar oluşturmaktan kaçınıyor.

Bu gerektirir libpq. Belgeleri burada bulabilirsiniz .


pg_restore ile böyle bir şey kullanabilir misin? Teşekkürler!
the_ccalderon

1
@ ccalderon911217 Görünüşe göre şunları yapabilirsiniz: stackoverflow.com/a/28359470/1388292
Jacques Gaudin

@JacquesGaudin yep kendimi test ettim! Teşekkür ederim!
the_ccalderon

26

Windows'ta:

  1. PGPASSWORD'e değer atayın: C:\>set PGPASSWORD=pass

  2. Çalıştır komutu: C:\>psql -d database -U user

hazır

Veya bir satırda,

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

&&!


1
Bunu denedim ve işe yaramadı. Hala bir şifre isteniyor.
antipattern

1
@antipattern Seçeneği -wde geçmelisiniz .
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"İşler.
Steve Shipway

21

Bu .pgpass, (Linux) Kullanıcının ana dizininde bir dosya oluşturarak yapılabilir . .pgpass dosya formatı:

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

*Ayrıntılar yerine joker de kullanabilirsiniz .

tmp.sqlParola sormadan çalıştırmak istediğimi varsayalım.

Aşağıdaki kod ile * .sh dosyasında yapabilirsiniz

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 `        

11
Echo "` chmod 0600 $ HOME / .pgpass `" nin anlamı nedir? Sadece chmod 0600 $ HOME / .pgpass'a ne dersiniz?
Vlad Patryshev

12

PGPASSWORDOrtam değişkenini kullanmanın bir alternatifi , conninfodizeyi belgelere göre kullanmaktır :

Bağlantı parametrelerini belirtmenin alternatif bir yolu, veritabanı adı yerine kullanılan bir conninfo dizgisinde veya bir URI'dadır. Bu mekanizma bağlantı üzerinde çok geniş bir kontrol sağlar.

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

postgres=>

4

.Bashrc'ye pg_env.sh içeriği eklendi:

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

ilavesiyle (user4653174 önerisine göre)

export PGPASSWORD='password'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.