Postgresql: Şifre ile komut dosyası çalıştırma psql


274

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.


4
Sonunda PGPASSWORD ortam değişkeni olacaktı. Bu benim kullanımımı mükemmel bir şekilde uydurdu. Basit ve senaryoda kendi kendine yeten.
Axel Fontaine


Yanıtlar:


315

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 PGPASSWORDortam 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 ...

11
Bence PGPASSWORD kullanımdan kaldırıldı ama hala çalışıyor, btw. Just FYI
Scott Marlowe

35
Evet, kullanımdan kaldırıldı (ve bağlantılardan birinde belirtildi). Geldiği için, muhtemelen, kullanımdan kaldırılmasına sıcak bir şekilde itiraz edildiğini belirtmek gerekir, çünkü birçok insan için son derece yararlıdır, ancak bazı durumlarda ciddi güvenlik endişeleri olmadan kullanılabilir. Bana öyle geliyor ki, örneğin .pgpass dosyasını bir NFS dosya sisteminde depolamaktan daha kötü değil. PGPASSWORD'ü rutin olarak kullanıyorum.
Reece

1
komut satırı bilgisinin "tüm kullanıcılar tarafından kullanılabilir" fikri, çok kullanıcılı sistemler hakkındaki eski varsayımlara dayanır ve sistemlerin tek bir uygulama çalıştırdığı ve hepsinin otomatik olduğu çoğu modern ortamda geçerli değildir
Alex R

159
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

1
bu terraform'da da işe yarıyor. sen, arkadaşım, bir cankurtaran vardır
wildthing81

67

Bu komut satırını komut dosyanızın başlangıcına ekleyebilirsiniz:

set PGPASSWORD=[your password]

24
benim durumumda set komutu işe yaramadı ama export PGPASSWORD=[password]işe yaradı
Can Kavaklıoğlu

kabuk betiğinde çalışmaz. Ben onu kullanıyorum #!/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
Govind Gupta

2
Boşluk kullanmamaya çalışın, örn. PGPASSWORD=password.
Ariejan

48

Birden çok anasistem / veritabanı bağlantısı kurmayı düşünüyorsanız , ~ / .pgpass dosyası bu yöntemdir.

Adımlar:

  1. Dosyayı vim ~/.pgpassveya 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.
  2. chmod 0600 ~/.pgpassPsql tarafından sessizce göz ardı edilmemesi için gerekir .
  3. Bash profilinizde sizin için psql komutunuzu çalıştıran bir takma ad oluşturun. Örneğin: alias postygresy='psql --host hostname database_name -U username'Değerler ~ / .pgpass dosyasına girdiğiniz değerlerle eşleşmelidir.
  4. Bash profilinizi . ~/.bashrcbenzer veya benzer şekilde kaynaklayın.
  5. Diğer adınızı komut satırından yazın.

Dışa aktarma PGPASSWORD = '' değişken kümeniz varsa, dosyaya göre öncelikli olacağını unutmayın.


1
chmod 600Dosyada bir yapmalısınız , aksi psqltakdirde sessizce yoksayar (dokümanlara göre).
RichVel

33

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

2
Postrgres 9.3, ortam değişkenini yok sayarPGPASSWORD
david.perez

14

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 :)


1
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?
Devin Snyder

Sadece cl ile çalışır, dosyaya eklediniz değil mi? Şimdi sadece komuta yazdınız mı?
Jamie Hutber

Linux / mac ortamında kullanmak için sorun yok, Windows için, bu ortam değişkenini dışa aktarmak için bir yol bulmanız gerektiğini düşünüyorum.
Pengfei.X

Yani küresel bir şifre ekleyin ... Bu da ilginç bir fikir
Jamie Hutber


7

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:

  1. Kullanmak istediğiniz şifreyle kendi geçici pgpass dosyanızı yazın.
  2. Psql'ye bu dosyayı kullanmasını bildirmek için PGPASSFILE ortam değişkenini kullanın.
  3. Geçici pgpass dosyasını kaldırın

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

Bu yaklaşımın çalışan bir örneği stackoverflow.com/a/40614592/3696363 - bu soruya başka bir cevap olarak görünüyor .
Eliyahu Skoczylas

Bu kullanıcı aradığım şeyi gerçekten sormasa da, yaklaşımın uyuşmadığını söyleyebilirim. PGPASSFILE = <(her ne olursa olsun) sözdizimini kullanırken, bir dosyanın şifresini çözme ve yalnızca oluşturulan dosya tanımlayıcısında mevcut olması gibi şeyler yapabilirsiniz. Bir geçici dosya yazarak, temelde kimlik bilgilerine sahip bir dosyaya sahip olma sorununu temel olarak çözmezsiniz. Bunun gibi keyfi endüstri kurallarıyla uğraşmak eğlenceli değil, ama birçok insanın uğraştığı bir şey.
17'de Desidero

7

Sadece PGPASSWORD kullanılarak yapılabilir. Psql 9.5.10 kullanıyorum. Sizin durumunuzda çözüm

PGPASSWORD=password psql -U myuser < myscript.sql


5

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.

chmodKomutun 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 , -hmyserver , -pmyport veya -Ujdoe 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!


4
mktempKendi adlandırma düzeninizi bulmak yerine geçici bir dosya oluşturmak için kullanabilirsiniz . Yeni bir geçici dosya oluşturur ( /tmp/tmp.ITXUNYgiNhLinux ve /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4MacOS X'te olduğu gibi adlandırılır ) ve adını stdout'a yazdırır.
Ivan Kolmychek

1
Güvenlik sorunuchmod 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 trapiş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 PGPASSWORDyerine kullanmanızı öneririz .
RichVel

@RichVel, bu küçük güvenlik boşluğunu gösterdiğin için teşekkürler. Dokunmatik yaratma ve kesin bir gelişmedir şifreyi koymadan önce dosya gizli yapar. PGPASSWORD9.3'te kullanımdan kaldırıldığı için bu tür bir çözüme ihtiyaç vardır.
Eliyahu Skoczylas

Bazı dokümanlar kullanımdan kaldırıldığını, ancak bu soru ve
cevaptaki

5

PGPASSWORDOrtam 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=>



-1

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.


-6

Komutta -w kullanın: psql -h localhost -p 5432 -U kullanıcı -w

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.