मैं psql को कैसे कह सकता हूं ताकि यह पासवर्ड के लिए संकेत न करे ?
यह वही है जो मेरे पास है:
psql -Umyuser < myscript.sql
हालाँकि, मुझे वह तर्क नहीं मिला जो पासवर्ड पास करता है, और इसलिए psql हमेशा इसके लिए संकेत देता है।
मैं psql को कैसे कह सकता हूं ताकि यह पासवर्ड के लिए संकेत न करे ?
यह वही है जो मेरे पास है:
psql -Umyuser < myscript.sql
हालाँकि, मुझे वह तर्क नहीं मिला जो पासवर्ड पास करता है, और इसलिए psql हमेशा इसके लिए संकेत देता है।
जवाबों:
PostgreSQL को प्रमाणित करने के कई तरीके हैं। आप https://www.postgresql.org/docs/current/static/client-authentication.html पर पासवर्ड प्रमाणीकरण के विकल्पों की जांच करना चाह सकते हैं ।
आपके प्रश्न का उत्तर देने के लिए, पासवर्ड-आधारित प्रमाणीकरण के लिए कुछ तरीके प्रदान करते हैं। पासवर्ड प्रॉम्प्ट के माध्यम से स्पष्ट रास्ता है। इसके बजाय, आप पासवर्ड को pgpass फ़ाइल में या PGPASSWORD
पर्यावरण चर के माध्यम से प्रदान कर सकते हैं । इन्हें देखें:
पासवर्ड को कमांड लाइन तर्क के रूप में प्रदान करने का कोई विकल्प नहीं है क्योंकि यह जानकारी अक्सर सभी उपयोगकर्ताओं के लिए उपलब्ध होती है, और इसलिए असुरक्षित है। हालाँकि, लिनक्स / यूनिक्स वातावरण में आप इस तरह एक एकल कमांड के लिए एक पर्यावरण चर प्रदान कर सकते हैं:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
आप अपनी स्क्रिप्ट की शुरुआत में इस कमांड लाइन को जोड़ सकते हैं:
set PGPASSWORD=[your password]
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
PGPASSWORD=password
।
यदि आप कई होस्ट / डेटाबेस कनेक्शन रखने का इरादा रखते हैं, तो ~ / .pgpass फाइल जाने का रास्ता है।
कदम:
vim ~/.pgpass
या समान बनाएँ । निम्नलिखित प्रारूप में अपनी जानकारी इनपुट करें:
hostname:port:database:username:password
अपने क्षेत्र मानों के आसपास स्ट्रिंग उद्धरण न जोड़ें। आप अपने पोर्ट / डेटाबेस फ़ील्ड के लिए वाइल्डकार्ड के रूप में * का भी उपयोग कर सकते हैं।chmod 0600 ~/.pgpass
आदेश देना चाहिए कि साइक्ल द्वारा चुपचाप अनदेखा न किया जाए।alias postygresy='psql --host hostname database_name -U username'
मान उन लोगों से मेल खाना चाहिए जिन्हें आपने ~ / .pgpass फ़ाइल में इनपुट किया है।. ~/.bashrc
या इसी तरह के अपने बैश प्रोफाइल को सोर्स करें ।ध्यान दें कि यदि आपके पास एक निर्यात PGPASSWORD = '' चर सेट है, तो यह फ़ाइल पर पूर्ववर्ती स्थिति लेगा।
chmod 600
फ़ाइल पर करना psql
होगा , अन्यथा चुपचाप (डॉक्स के अनुसार) इसे अनदेखा कर देगा।
यह एक पुराना प्रश्न हो सकता है, लेकिन एक वैकल्पिक विधि है जिसका आप उपयोग कर सकते हैं जिसका किसी ने उल्लेख नहीं किया है। कनेक्शन URI में सीधे पासवर्ड निर्दिष्ट करना संभव है। दस्तावेज़ीकरण यहां पाया जा सकता है , वैकल्पिक रूप से यहां ।
यूआरआई द्वारा दिए गए कनेक्शन में आप सीधे अपना उपयोगकर्ता नाम और पासवर्ड प्रदान कर सकते हैं psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
अगर आपको मेरी तरह विंडोज़ पर समस्या हो रही है (मैं विंडोज 7 64-बिट का उपयोग कर रहा हूं) और set PGPASSWORD=[Password]
काम नहीं किया।
फिर, जैसा कि कवाकलीग्लू ने एक टिप्पणी में कहा,
export PGPASSWORD=[password]
आपको इसे फ़ाइल के शीर्ष पर या किसी भी उपयोग से पहले सहेजने की आवश्यकता होगी ताकि इसे कॉल करने से पहले सेट किया जा सके।
निश्चित रूप से खिड़कियों पर काम करता है :)
export PGPASSWORD=[password]
कमांड लाइन (cmd.exe) का उपयोग करके मेरे लिए बिल्कुल भी काम नहीं करता है। क्या आप वाकई साइबर या कुछ इसी तरह का प्रयोग नहीं कर रहे थे?
आपको एक पासवर्ड फ़ाइल बनानी होगी: अधिक जानकारी के लिए http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html देखें ।
PGPASSWORD पर्यावरण चर का उपयोग करने के बारे में सुरक्षा चिंताओं को देखते हुए, मुझे लगता है कि सबसे अच्छा समग्र समाधान निम्नानुसार है:
यहां नोट के एक दो बिंदु हैं। चरण 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
जो लोग निक्स शेल स्क्रिप्टिंग के साथ सहज नहीं हैं, उनके लिए शक्तिशाली जवाब पर निर्माण , यहाँ एक काम कर स्क्रिप्ट है:
#!/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 पर, आप का उपयोग करने के लिए नहीं होगा -h
MyServer , -p
myport , या -U
jdoe अगर आप चूक (का उपयोग झंडा स्थानीय होस्ट : 5432 और केवल एक ही डेटाबेस उपयोगकर्ता है)। कई उपयोगकर्ताओं के लिए, (लेकिन डिफ़ॉल्ट कनेक्शन) उस रेखा को बदल देते हैं
psql mydb jdoe
मत भूलना स्क्रिप्ट बनाने के लिए निष्पादन योग्य के साथ
chmod +x runpsql
( या जिसे आपने स्क्रिप्ट फ़ाइल कहा है )
अपडेट करें:
मैंने रिचवेल की सलाह ली और पासवर्ड डालने से पहले फाइल को बिना पढ़े बना दिया । यह एक मामूली सुरक्षा छिद्र को बंद कर देता है। धन्यवाद!
mktemp
अपनी स्वयं की नामकरण योजना के साथ आने के बजाय एक अस्थायी फ़ाइल बनाने के लिए उपयोग कर सकते हैं । यह एक नई अस्थायी फ़ाइल बनाता है ( /tmp/tmp.ITXUNYgiNh
लिनक्स में और /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
मैकओएस एक्स पर कुछ नाम दिया गया है ) और स्टडआउट के लिए इसका नाम प्रिंट करता है।
chmod 600
फ़ाइल बनाने के बाद करना सबसे अच्छा है , लेकिन पासवर्ड लिखने से पहले। जैसा कि लिखा गया है, सर्वर पर एक दुर्भावनापूर्ण स्क्रिप्ट लगातार इस प्रारूप की फ़ाइलों को पढ़ने की कोशिश कर सकती है, और कभी-कभी पासवर्ड प्राप्त करने में सफल होगी। इसके अलावा, यदि यह स्क्रिप्ट किसी कारण से बाधित हो जाती है, तो फ़ाइल को डिस्क पर छोड़ दिया जाएगा - शेल trap
हैंडलर लिखने से यह पता चलेगा। यह देखते हुए कि इस तरह एक सुरक्षित स्क्रिप्ट लिखना तुच्छ नहीं है, मैं export PGPASSWORD
इसके बजाय उपयोग करने की सलाह देता हूं ।
PGPASSWORD
9.3 में पदावनत किया गया है।
PGPASSWORD
पर्यावरण चर का उपयोग करने का एक विकल्प दस्तावेज केconninfo
अनुसार स्ट्रिंग का उपयोग करना है
कनेक्शन मापदंडों को निर्दिष्ट करने का एक वैकल्पिक तरीका एक कॉनइन्फो स्ट्रिंग या एक यूआरआई है, जो डेटाबेस नाम के बजाय उपयोग किया जाता है। यह तंत्र आपको कनेक्शन पर बहुत व्यापक नियंत्रण देता है।
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
आपको यह उपयोगी लग सकता है: विंडोज पीएसक्यूएल कमांड लाइन: क्या पासवर्ड रहित लॉगिन की अनुमति देने का एक तरीका है?
8 साल बाद ...
मेरे मैक पर, मुझे फ़ाइल में एक लाइन डालनी थी
~/.pgpass
जैसे:
<IP>:<PORT>:<dbname>:<user>:<password>
इसे भी देखें:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
मुझे लगता है, कि psql पासवर्ड पासवर्ड प्रॉम्प्ट भी आप PGPASSWORD चर को परिभाषित करते हैं, लेकिन आप पासवर्ड प्रॉम्प्ट को छोड़ने के लिए psql के लिए -w विकल्प निर्दिष्ट कर सकते हैं।