मैं गैर-अंतःक्रियात्मक रूप से 'psql' के लिए एक पासवर्ड कैसे निर्दिष्ट करूं?


337

मैं एक शेल स्क्रिप्ट के साथ डेटाबेस निर्माण प्रक्रिया को स्वचालित करने की कोशिश कर रहा हूं और एक चीज जो मैंने psql को पासवर्ड पास करने के साथ एक रोड ब्लॉक मारा है । यहाँ शेल स्क्रिप्ट से थोड़ा सा कोड है:

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

मैं psqlगैर-संवादात्मक तरीके से पासवर्ड कैसे पास करूं ?


1
आप कनेक्शन url का उपयोग कर सकते हैं। इस उत्तर की जाँच करें stackoverflow.com/questions/3582552/postgres-connection-url
पौलोदियोवानी

जवाबों:


141

से आधिकारिक दस्तावेज :

पासवर्ड टाइप करने के लिए नियमित रूप से बचने के लिए ~ / .pg पार फ़ाइल रखना भी सुविधाजनक है। अधिक जानकारी के लिए धारा 30.13 देखें ।

...

इस फ़ाइल में निम्न प्रारूप की लाइनें होनी चाहिए:

hostname:port:database:username:password

पहली पंक्ति से पासवर्ड फ़ील्ड जो वर्तमान कनेक्शन मापदंडों से मेल खाती है, का उपयोग किया जाएगा।


29
धन्यवाद, मुझे pgpass के बारे में पता है, लेकिन यह इस मुद्दे को हल नहीं करता है - मुझे डेटाबेस पर काम करने के लिए एक स्व-निहित बैश स्क्रिप्ट की आवश्यकता है, इसलिए कमांड लाइन के माध्यम से psql को जानकारी पारित करने के बारे में मेरा प्रश्न है।
एलेक्स एन।

6
मुझे लगता है कि आपका एकमात्र विकल्प एक .pgpass फ़ाइल को सेट करना है, जिसकी आपकी bash स्क्रिप्ट तक पहुँच है। या पासवर्ड का उपयोग बिल्कुल न करें - आप प्रमाणीकरण का एक और रूप सेट कर सकते हैं, जैसे कि पहचान, या एसएसएल प्रमाणपत्र का उपयोग करना।
21

मुझे डर है कि :) जानकारी के लिए धन्यवाद!
एलेक्स एन।

एक अन्य विकल्प उम्मीद का उपयोग करना हो सकता है। लेकिन मुझे वास्तव में उम्मीद से नफरत है :)
टिमटिमाते हुए

1
समूह और अन्य उपयोगकर्ता की अनुमति को पढ़ने, लिखने, निष्पादित करने के लिए मत भूलना .pg फ़ाइल! रनchmod go-rwx .pgpass
व्लादिस्लाव डोभालगेस

611

Psql कॉल करने से पहले स्क्रिप्ट के अंदर PGPASSWORD पर्यावरण चर सेट करें

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

संदर्भ के लिए, http://www.postgresql.org/docs/current/static/libpq-envars.html देखें


संपादित करें

चूंकि Postgres 9.2 में कनेक्शन स्ट्रिंग या URI निर्दिष्ट करने का विकल्प भी है जिसमें उपयोगकर्ता नाम और पासवर्ड हो सकते हैं।

इसका उपयोग करना एक सुरक्षा जोखिम है क्योंकि पासवर्ड एक पाठ प्रक्रिया में दिखाई देता है जब psअन्य उपयोगकर्ताओं द्वारा (लिनक्स), प्रोसेसएक्सप्लॉयर (विंडोज) या इसी तरह के उपकरणों का उपयोग करते हुए चल रही प्रक्रिया की कमांड लाइन को देखा जाता है।

डेटाबेस प्रशासकों पर भी यह प्रश्न देखें


32
उदाहरण के लिए एक पंक्ति में आप कुछ ऐसा कर सकते हैं: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
मुझे लगता है कि यह केवल एसक्यूएल स्क्रिप्ट चलाने का सबसे सुविधाजनक तरीका है।
zr870

2
मैं केवल spaceपहली पंक्ति में कमांड लाइन में जोड़ - जोड़ सकता हूं और कमांड को बैश इतिहास में संग्रहीत नहीं किया जाएगा। Ubuntu / bash के लिए काम करता है।
बाल्ड

5
बोनस: डॉकर के लिए काम करता है:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
बिलाल अकिल

3
सावधान रहें और हमेशा एक पूर्ववर्ती स्थान जोड़ना सुनिश्चित करें अन्यथा यह आपके बैश इतिहास में दिखाएगा ~ / .bash_history फ़ाइल ...
rogerdpack

102
  • एक पंक्ति में:

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

    साथ आदेश में इस तरह के रूप में एक एसक्यूएल आदेश"select * from schema.table"

  • या अधिक पठनीय:

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

18
एक पंक्ति को थोड़ा सरल किया जा सकता है: PGPASSWORD='password' psql .... जिसमें कमांड के पूरा हो जाने के बाद भी वैरिएबल का लाभ सुलभ नहीं है।
गैरेट

3
export PGPASSWORD=YourNewPasswordमेरे लिए अन्य विविधताओं पर काम किया।
मिकुमस

7
export PGPASSWORDएक बहुत बुरा विचार की तरह लगता है
Hasen

1
यह आपके bash इतिहास में पासवर्ड सेव करेगा ~ / .bash_history फ़ाइल (जब तक कि आप सावधानीपूर्वक हमेशा एक पूर्ववर्ती स्थान नहीं जोड़ते हैं), और पासवर्ड को अपने वर्तमान वातावरण में भी निर्यात करें FWIW: |
रोजरपैक

68

मैं psql के लिए एक URL पास करना पसंद करता हूं :

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

यह मुझे मेरे पर्यावरण चर नाम देने की स्वतंत्रता देता है जैसा कि मैं चाहता हूं और अनावश्यक फाइलें बनाने से बचता हूं।

इसके लिए आवश्यकता है libpq। प्रलेखन यहाँ पाया जा सकता है


क्या आप pg_restore के साथ ऐसा कुछ उपयोग कर सकते हैं? धन्यवाद!
the_ccalderon

1
@ ccalderon911217 जाहिरा तौर पर आप कर सकते हैं: stackoverflow.com/a/28359470/1388292
जैक्स

@JacquesGaudin हां ने अपना परीक्षण किया! धन्यवाद!
the_ccalderon

26

विंडोज पर:

  1. PGPASSWORD को मान निर्दिष्ट करें: C:\>set PGPASSWORD=pass

  2. चलाने के आदेश: C:\>psql -d database -U user

तैयार

या एक पंक्ति में,

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

&& से पहले स्थान की कमी पर ध्यान दें!


1
मैंने कोशिश की, और यह काम नहीं किया। फिर भी पासवर्ड मांगा जा रहा है।
एंटीपैर्टन

1
@antipattern आपको विकल्प -wभी पास करना होगा ।
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"काम करता है।
स्टीव शिपवे

21

यह .pgpass(लिनक्स) उपयोगकर्ता की होम निर्देशिका में एक फ़ाइल बनाकर किया जा सकता है । .pgpass फाइल प्रारूप:

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

आप *विवरण के स्थान पर वाइल्ड कार्ड का भी उपयोग कर सकते हैं ।

कहते हैं कि मैं tmp.sqlएक पासवर्ड के लिए संकेत दिए बिना चलाना चाहता था ।

निम्नलिखित कोड के साथ आप * .sh फ़ाइल में कर सकते हैं

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
क्या गूंज है "` chmod 0600 $ HOME / .pgpass `"? कैसे बस के बारे में 0600 $ घर /।
व्लाद पैट्रीशेव

12

PGPASSWORDपर्यावरण चर का उपयोग करने का एक विकल्प दस्तावेज केconninfo अनुसार स्ट्रिंग का उपयोग करना है :

कनेक्शन मापदंडों को निर्दिष्ट करने का एक वैकल्पिक तरीका एक कॉनफ़िऑन ​​स्ट्रिंग या एक यूआरआई है, जो डेटाबेस नाम के बजाय उपयोग किया जाता है। यह तंत्र आपको कनेक्शन पर बहुत व्यापक नियंत्रण देता है।

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

postgres=>

4

मेरे .bashrc में pg_env.sh की सामग्री जोड़ी गई:

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

के अतिरिक्त (user4653174 सुझाव के अनुसार)

export PGPASSWORD='password'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.