Postgresql: पासवर्ड के साथ psql निष्पादन की स्क्रिप्टिंग


274

मैं psql को कैसे कह सकता हूं ताकि यह पासवर्ड के लिए संकेत न करे ?

यह वही है जो मेरे पास है:

psql -Umyuser < myscript.sql

हालाँकि, मुझे वह तर्क नहीं मिला जो पासवर्ड पास करता है, और इसलिए psql हमेशा इसके लिए संकेत देता है।


4
मैंने PGPASSWORD पर्यावरण चर के लिए जाना समाप्त कर दिया। यह मेरे usecase को पूरी तरह से फिट करता है। स्क्रिप्ट में सरल और आत्म-निहित।
एक्सल फोंटेन


जवाबों:


315

PostgreSQL को प्रमाणित करने के कई तरीके हैं। आप https://www.postgresql.org/docs/current/static/client-authentication.html पर पासवर्ड प्रमाणीकरण के विकल्पों की जांच करना चाह सकते हैं ।

आपके प्रश्न का उत्तर देने के लिए, पासवर्ड-आधारित प्रमाणीकरण के लिए कुछ तरीके प्रदान करते हैं। पासवर्ड प्रॉम्प्ट के माध्यम से स्पष्ट रास्ता है। इसके बजाय, आप पासवर्ड को pgpass फ़ाइल में या PGPASSWORDपर्यावरण चर के माध्यम से प्रदान कर सकते हैं । इन्हें देखें:

पासवर्ड को कमांड लाइन तर्क के रूप में प्रदान करने का कोई विकल्प नहीं है क्योंकि यह जानकारी अक्सर सभी उपयोगकर्ताओं के लिए उपलब्ध होती है, और इसलिए असुरक्षित है। हालाँकि, लिनक्स / यूनिक्स वातावरण में आप इस तरह एक एकल कमांड के लिए एक पर्यावरण चर प्रदान कर सकते हैं:

PGPASSWORD=yourpass psql ...

11
मुझे लगता है कि PGPASSWORD को हटा दिया गया है लेकिन फिर भी काम करता है, btw। जस्ट एफवाईआई
स्कॉट मारलो

35
हां, यह पदावनत है (और इसलिए एक लिंक में नोट किया गया है)। जब से यह आया है, यह शायद यह भी ध्यान देने योग्य है कि पदावनति का चुनाव गर्म रूप से लड़ा जाता है क्योंकि यह कई लोगों के लिए अत्यंत उपयोगी है, फिर भी कुछ परिस्थितियों में गंभीर सुरक्षा चिंताओं के बिना इसका उपयोग किया जा सकता है। यह मुझे लगता है कि यह स्टोर करने से भी बदतर नहीं है। उदाहरण के लिए, NFS फाइल सिस्टम पर। मैं नियमित रूप से PGPASSWORD का उपयोग करता हूं।
रीस

1
यह विचार है कि कमांड लाइन की जानकारी "सभी उपयोगकर्ताओं के लिए उपलब्ध है" बहु-उपयोगकर्ता प्रणालियों के बारे में पुरातन मान्यताओं पर आधारित है और अधिकांश आधुनिक वातावरणों में लागू नहीं होती है जहाँ सिस्टम केवल एक ही अनुप्रयोग चलाते हैं और यह सभी स्वचालित है
एलेक्स आर

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

1
यह टेराफॉर्म में भी काम करता है। आप, मेरे दोस्त, एक जीवनरक्षक हैं
Wildthing81

67

आप अपनी स्क्रिप्ट की शुरुआत में इस कमांड लाइन को जोड़ सकते हैं:

set PGPASSWORD=[your password]

24
मेरे मामले में सेट कमांड ने काम नहीं किया, लेकिन काम नहीं export PGPASSWORD=[password]किया
कैन कावलाओलू

यह शेल स्क्रिप्ट में काम नहीं करता है। मैं इसका उपयोग कर रहा हूं #!/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
गोविंद गुप्ता

2
रिक्त स्थान का उपयोग न करने की कोशिश करें, जैसे। PGPASSWORD=password
आर्यजन

48

यदि आप कई होस्ट / डेटाबेस कनेक्शन रखने का इरादा रखते हैं, तो ~ / .pgpass फाइल जाने का रास्ता है।

कदम:

  1. फ़ाइल का उपयोग करके vim ~/.pgpassया समान बनाएँ । निम्नलिखित प्रारूप में अपनी जानकारी इनपुट करें: hostname:port:database:username:passwordअपने क्षेत्र मानों के आसपास स्ट्रिंग उद्धरण न जोड़ें। आप अपने पोर्ट / डेटाबेस फ़ील्ड के लिए वाइल्डकार्ड के रूप में * का भी उपयोग कर सकते हैं।
  2. इसके लिए आपको chmod 0600 ~/.pgpassआदेश देना चाहिए कि साइक्ल द्वारा चुपचाप अनदेखा न किया जाए।
  3. अपने बैश प्रोफ़ाइल में एक उपनाम बनाएं जो आपके लिए आपके psll कमांड को चलाता है। उदाहरण के लिए: alias postygresy='psql --host hostname database_name -U username'मान उन लोगों से मेल खाना चाहिए जिन्हें आपने ~ / .pgpass फ़ाइल में इनपुट किया है।
  4. साथ . ~/.bashrcया इसी तरह के अपने बैश प्रोफाइल को सोर्स करें ।
  5. कमांड लाइन से अपना उपनाम लिखें।

ध्यान दें कि यदि आपके पास एक निर्यात PGPASSWORD = '' चर सेट है, तो यह फ़ाइल पर पूर्ववर्ती स्थिति लेगा।


1
आपको chmod 600फ़ाइल पर करना psqlहोगा , अन्यथा चुपचाप (डॉक्स के अनुसार) इसे अनदेखा कर देगा।
रिचवेल

33

यह एक पुराना प्रश्न हो सकता है, लेकिन एक वैकल्पिक विधि है जिसका आप उपयोग कर सकते हैं जिसका किसी ने उल्लेख नहीं किया है। कनेक्शन URI में सीधे पासवर्ड निर्दिष्ट करना संभव है। दस्तावेज़ीकरण यहां पाया जा सकता है , वैकल्पिक रूप से यहां

यूआरआई द्वारा दिए गए कनेक्शन में आप सीधे अपना उपयोगकर्ता नाम और पासवर्ड प्रदान कर सकते हैं psql:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

2
Postrgres 9.3 पर्यावरण की अनदेखी करता हैPGPASSWORD
david.perez

14

अगर आपको मेरी तरह विंडोज़ पर समस्या हो रही है (मैं विंडोज 7 64-बिट का उपयोग कर रहा हूं) और set PGPASSWORD=[Password]काम नहीं किया।

फिर, जैसा कि कवाकलीग्लू ने एक टिप्पणी में कहा,

export PGPASSWORD=[password]

आपको इसे फ़ाइल के शीर्ष पर या किसी भी उपयोग से पहले सहेजने की आवश्यकता होगी ताकि इसे कॉल करने से पहले सेट किया जा सके।

निश्चित रूप से खिड़कियों पर काम करता है :)


1
export PGPASSWORD=[password]कमांड लाइन (cmd.exe) का उपयोग करके मेरे लिए बिल्कुल भी काम नहीं करता है। क्या आप वाकई साइबर या कुछ इसी तरह का प्रयोग नहीं कर रहे थे?
डेविन स्नाइडर

केवल सीएल के साथ काम करता है, आपने इसे फ़ाइल में जोड़ा है? अब बस इसे कमांड में टाइप करें?
जेमी हटबर

खिड़कियों के लिए लिनक्स / मैक वातावरण में इसका उपयोग करना ठीक है, मुझे लगता है कि आपको इस पर्यावरण चर को निर्यात करने का एक तरीका खोजना चाहिए।
पेंगफेई .X

तो एक वैश्विक पासवर्ड जोड़ें ... Thats एक दिलचस्प विचार है
जेमी हटबर


7

PGPASSWORD पर्यावरण चर का उपयोग करने के बारे में सुरक्षा चिंताओं को देखते हुए, मुझे लगता है कि सबसे अच्छा समग्र समाधान निम्नानुसार है:

  1. जिस पासवर्ड का आप उपयोग करना चाहते हैं, उसके साथ अपनी खुद की अस्थायी pgpass फ़ाइल लिखें।
  2. उस फ़ाइल का उपयोग करने के लिए psql को बताने के लिए PGPASSFILE पर्यावरण चर का उपयोग करें।
  3. अस्थायी pgpass फ़ाइल निकालें

यहां नोट के एक दो बिंदु हैं। चरण 1 उपयोगकर्ता की ~ / .pgpass फ़ाइल के साथ मौजूद होने से बचने के लिए है। आपको यह भी सुनिश्चित करना होगा कि फ़ाइल की अनुमति 0600 या उससे कम है।

कुछ ने इस प्रकार से शॉर्टकट के लिए लीवरेजिंग बैश का सुझाव दिया है:

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

यह डेटा को वास्तविक फ़ाइल में लिखने की आवश्यकता से बचने के लिए <() सिंटैक्स का उपयोग करता है। लेकिन यह काम नहीं करता क्योंकि psql जाँचता है कि किस फ़ाइल का उपयोग किया जा रहा है और इस तरह से एक त्रुटि होगी:

WARNING: password file "/dev/fd/63" is not a plain file

इस दृष्टिकोण का एक कार्य उदाहरण stackoverflow.com/a/40614592/3696363 में दिखाई देता है - इस प्रश्न का एक और उत्तर।
एलियाहू स्कुक्ज़िलस

हालाँकि यह उपयोगकर्ता वास्तव में उसी चीज़ के लिए नहीं पूछ रहा है जिसकी मुझे तलाश है, मैं कहूँगा कि दृष्टिकोण मेल नहीं खाता है। PGPASSFILE = <(जो भी) सिंटैक्स का उपयोग करते समय, आप किसी फ़ाइल को डिक्रिप्ट करने जैसी चीजें कर सकते हैं और केवल उस फ़ाइल डिस्क्रिप्टर में मौजूद है जो बनाई गई है। एक अस्थायी फ़ाइल लिखकर, आप मूल रूप से क्रेडेंशियल्स के साथ डिस्क पर फ़ाइल होने की समस्या को हल नहीं कर रहे हैं। यह उस तरह के मनमाने उद्योग नियमों से निपटने में मज़ेदार नहीं है, लेकिन यह एक ऐसी चीज़ है जिससे बहुत से लोग निपटते हैं।
डेसिडेरो

7

यह केवल PGPASSWORD का उपयोग करके किया जा सकता है। मैं psql का उपयोग कर रहा हूँ 9.5.10। आपके मामले में समाधान होगा

PGPASSWORD=password psql -U myuser < myscript.sql


5

जो लोग निक्स शेल स्क्रिप्टिंग के साथ सहज नहीं हैं, उनके लिए शक्तिशाली जवाब पर निर्माण , यहाँ एक काम कर स्क्रिप्ट है:

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

पंक्ति 2 $$में डबल डॉलर का चिह्न ( ) /tmp/pgpasswd$$फ़ाइल नाम के लिए प्रक्रिया आईडी संख्या को जोड़ देता है, ताकि इस स्क्रिप्ट को एक बार से अधिक, एक साथ, बिना साइड इफेक्ट के भी चलाया जा सके।

chmodलाइन 4 पर कमांड के उपयोग पर ध्यान दें - ठीक उसी तरह जैसे " एक सादा फ़ाइल नहीं " त्रुटि जो शक्तिशाली वर्णित है, अगर ऐसा नहीं किया जाता है, तो " अनुमति " त्रुटि भी है।

लाइन 7 पर, आप का उपयोग करने के लिए नहीं होगा -hMyServer , -pmyport , या -Ujdoe अगर आप चूक (का उपयोग झंडा स्थानीय होस्ट : 5432 और केवल एक ही डेटाबेस उपयोगकर्ता है)। कई उपयोगकर्ताओं के लिए, (लेकिन डिफ़ॉल्ट कनेक्शन) उस रेखा को बदल देते हैं

psql mydb jdoe

मत भूलना स्क्रिप्ट बनाने के लिए निष्पादन योग्य के साथ

chmod +x runpsql( या जिसे आपने स्क्रिप्ट फ़ाइल कहा है )

अपडेट करें:

मैंने रिचवेल की सलाह ली और पासवर्ड डालने से पहले फाइल को बिना पढ़े बना दिया । यह एक मामूली सुरक्षा छिद्र को बंद कर देता है। धन्यवाद!


4
आप mktempअपनी स्वयं की नामकरण योजना के साथ आने के बजाय एक अस्थायी फ़ाइल बनाने के लिए उपयोग कर सकते हैं । यह एक नई अस्थायी फ़ाइल बनाता है ( /tmp/tmp.ITXUNYgiNhलिनक्स में और /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4मैकओएस एक्स पर कुछ नाम दिया गया है ) और स्टडआउट के लिए इसका नाम प्रिंट करता है।
इवान कोलेमिचेक

1
सुरक्षा समस्याchmod 600 फ़ाइल बनाने के बाद करना सबसे अच्छा है , लेकिन पासवर्ड लिखने से पहले। जैसा कि लिखा गया है, सर्वर पर एक दुर्भावनापूर्ण स्क्रिप्ट लगातार इस प्रारूप की फ़ाइलों को पढ़ने की कोशिश कर सकती है, और कभी-कभी पासवर्ड प्राप्त करने में सफल होगी। इसके अलावा, यदि यह स्क्रिप्ट किसी कारण से बाधित हो जाती है, तो फ़ाइल को डिस्क पर छोड़ दिया जाएगा - शेल trapहैंडलर लिखने से यह पता चलेगा। यह देखते हुए कि इस तरह एक सुरक्षित स्क्रिप्ट लिखना तुच्छ नहीं है, मैं export PGPASSWORDइसके बजाय उपयोग करने की सलाह देता हूं ।
रिचवेल

धन्यवाद, @RichVel उस छोटे से सुरक्षा छेद को इंगित करने के लिए। इसमें पासवर्ड डालने से पहले फाइल को निजी बनाना और बनाना स्पर्श करना एक निश्चित सुधार है। इस तरह के समाधान की आवश्यकता है क्योंकि PGPASSWORD9.3 में पदावनत किया गया है।
एलियाहू स्कुक्ज़िलस

डॉक्स में से कुछ का कहना है कि यह पदावनत है, लेकिन जैसा कि इस प्रश्नोत्तर में एक टिप्पणी में उल्लेख किया गया है ,
पदावनति

5

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

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

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

postgres=>


1

8 साल बाद ...

मेरे मैक पर, मुझे फ़ाइल में एक लाइन डालनी थी ~/.pgpassजैसे:

<IP>:<PORT>:<dbname>:<user>:<password>

इसे भी देखें:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass


यदि आप उपयोग करते हैं तो psql के लिए -W का उपयोग न करें। यह पैरामीटर रद्द करें .pg उपयोग बंद करें।
एविंसिस

-1

मुझे लगता है, कि psql पासवर्ड पासवर्ड प्रॉम्प्ट भी आप PGPASSWORD चर को परिभाषित करते हैं, लेकिन आप पासवर्ड प्रॉम्प्ट को छोड़ने के लिए psql के लिए -w विकल्प निर्दिष्ट कर सकते हैं।


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