Nasıl Arayabileceğim psql'i o yüzden şifre istemi yapmaz ?
Sahip olduğum şey bu:
psql -Umyuser < myscript.sql
Ancak, şifreyi geçen argümanı bulamadım ve bu yüzden psql her zaman bunu ister.
Nasıl Arayabileceğim psql'i o yüzden şifre istemi yapmaz ?
Sahip olduğum şey bu:
psql -Umyuser < myscript.sql
Ancak, şifreyi geçen argümanı bulamadım ve bu yüzden psql her zaman bunu ister.
Yanıtlar:
PostgreSQL kimlik doğrulamasının birkaç yolu vardır. Https://www.postgresql.org/docs/current/static/client-authentication.html adresinden şifre kimlik doğrulamasına alternatifleri araştırmak isteyebilirsiniz. .
Sorunuzu cevaplamak için, parola tabanlı kimlik doğrulaması için parola sağlamanın birkaç yolu vardır. Açık olan yol şifre istemidir. Bunun yerine, parolayı bir pgpass dosyasında veya PGPASSWORD
ortam değişkeni aracılığıyla sağlayabilirsiniz. Bunlara bakın:
Parolayı komut satırı bağımsız değişkeni olarak sağlama seçeneği yoktur, çünkü bu bilgiler tüm kullanıcılar tarafından sık sık kullanılabilir ve bu nedenle güvensizdir. Ancak, Linux / Unix ortamlarında, aşağıdaki gibi tek bir komut için bir ortam değişkeni sağlayabilirsiniz:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Bu komut satırını komut dosyanızın başlangıcına ekleyebilirsiniz:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
işe yaradı
#!/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
.
Birden çok anasistem / veritabanı bağlantısı kurmayı düşünüyorsanız , ~ / .pgpass dosyası bu yöntemdir.
Adımlar:
vim ~/.pgpass
veya benzerini kullanarak oluşturun . Bilgilerinizi aşağıdaki biçimde girin:
hostname:port:database:username:password
Alan değerlerinize dize tırnak işaretleri eklemeyin. Bağlantı noktası / veritabanı alanlarınız için * joker karakter olarak da kullanabilirsiniz.chmod 0600 ~/.pgpass
Psql tarafından sessizce göz ardı edilmemesi için gerekir .alias postygresy='psql --host hostname database_name -U username'
Değerler ~ / .pgpass dosyasına girdiğiniz değerlerle eşleşmelidir.. ~/.bashrc
benzer veya benzer şekilde kaynaklayın.Dışa aktarma PGPASSWORD = '' değişken kümeniz varsa, dosyaya göre öncelikli olacağını unutmayın.
chmod 600
Dosyada bir yapmalısınız , aksi psql
takdirde sessizce yoksayar (dokümanlara göre).
Bu eski bir soru olabilir, ancak kimsenin bahsetmediği alternatif bir yöntem kullanabilirsiniz. Parolayı doğrudan bağlantı URI'sinde belirtmek mümkündür. Dokümantasyon burada , alternatif olarak burada bulunabilir .
Kullanıcı adınızı ve şifrenizi doğrudan aşağıdakilere sağlanan bağlantı URI'sinde sağlayabilirsiniz psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
Benim gibi pencerelerde sorun yaşıyorsanız (Windows 7 64 bit kullanıyorum) ve set PGPASSWORD=[Password]
işe yaramadı.
Sonra Kavaklıoğlu'nun yorumlardan birinde söylediği gibi,
export PGPASSWORD=[password]
Bunu dosyanın üst kısmına veya herhangi bir kullanımdan önce, çağrılmadan önce ayarlanması için kaydetmeniz gerekir.
Kesinlikle pencerelerde çalışır :)
export PGPASSWORD=[password]
hiç komut satırı (cmd.exe) kullanarak benim için çalışmıyor. Cygwin ya da benzeri bir şey kullanmadığınızdan emin misiniz?
Bir şifre dosyası oluşturmanız gerekir: Daha fazla bilgi için http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html adresine bakın .
PGPASSWORD ortam değişkeninin kullanımıyla ilgili güvenlik endişeleri göz önüne alındığında, en iyi genel çözümün aşağıdaki gibi olduğunu düşünüyorum:
Burada birkaç nokta var. Adım 1, kullanıcının ~ / .pgpass dosyasıyla karışmayı önlemek için vardır. Ayrıca dosyanın 0600 veya daha az izinlere sahip olduğundan emin olmalısınız.
Bazıları bunu kısayol yapmak için bash'tan yararlanmayı önerdi:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
Bu, verileri gerçek bir dosyaya yazmanıza gerek kalmamak için <() sözdizimini kullanır. Ancak psql hangi dosyanın kullanıldığını kontrol ettiğinden ve böyle bir hata atacağından çalışmaz:
WARNING: password file "/dev/fd/63" is not a plain file
Bina mightybyte cevabı ile rahat olmayanlar için * nix kabuk komut dosyası, burada bir çalışma komut dosyası:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
Satır 2'deki çift dolar işareti ( $$
) /tmp/pgpasswd$$
, dosya adına işlem kimlik numarasını ekler, böylece bu komut dosyası, yan etkiler olmadan aynı anda birden fazla kez çalıştırılabilir.
chmod
Komutun 4. satırda kullanıldığına dikkat edin - tıpkı açıklandığı gibi " düz dosya değil " hatası gibi, bu yapılmazsa " izinler " hatası da vardır.
7. satırda , varsayılanları ( localhost : 5432 ) kullanırsanız ve yalnızca bir veritabanı kullanıcısı varsa , -h
myserver , -p
myport veya -U
jdoe bayrağını kullanmanız gerekmez. Birden çok kullanıcı için (ancak varsayılan bağlantı) bu satırı
psql mydb jdoe
Komut dosyasını ile çalıştırılabilir yapmayı unutmayın
chmod +x runpsql
( veya komut dosyası adını verdiğiniz her neyse )
GÜNCELLEME:
Çektiğim RichVel 'ın tavsiye ve okunamaz dosyayı yapılmış önce içine şifresini koyarak. Bu hafif bir güvenlik açığını kapatır. Teşekkürler!
mktemp
Kendi adlandırma düzeninizi bulmak yerine geçici bir dosya oluşturmak için kullanabilirsiniz . Yeni bir geçici dosya oluşturur ( /tmp/tmp.ITXUNYgiNh
Linux ve /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
MacOS X'te olduğu gibi adlandırılır ) ve adını stdout'a yazdırır.
chmod 600
Dosyayı oluşturduktan sonra, ancak parolayı yazmadan önce yapmak en iyisidir . Yazıldığı gibi, sunucudaki kötü amaçlı bir komut dosyası sürekli olarak bu biçimdeki dosyaları okumaya çalışabilir ve bazen parolayı almayı başarabilir. Ayrıca, bu komut dosyası herhangi bir nedenle kesintiye uğrarsa, dosya diskte bırakılır - bir kabuk trap
işleyici yazmak bu sorunu giderir. Bunun gibi güvenli bir komut dosyası yazmanın önemsiz olduğu göz önüne alındığında, bunun export PGPASSWORD
yerine kullanmanızı öneririz .
PGPASSWORD
9.3'te kullanımdan kaldırıldığı için bu tür bir çözüme ihtiyaç vardır.
PGPASSWORD
Ortam değişkenini kullanmanın bir alternatifi conninfo
, belgelere göre dize 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=>
Bunu yararlı bulabilirsiniz: Windows PSQL komut satırı: şifresiz oturum açmaya izin vermenin bir yolu var mı?
8 yıl sonra ...
Mac bilgisayarımda, dosyaya şöyle bir satır koymak zorunda kaldım
~/.pgpass
:
<IP>:<PORT>:<dbname>:<user>:<password>
Ayrıca bkz:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
Ben PGPASSWORD değişken tanımlamak bile psql göstermek şifre istemi bulmak, ama psql şifre istemini atlamak için -w seçeneği belirtebilirsiniz.