Pg_dump में पासवर्ड कैसे पास करें?


294

मैं हर रात कुछ विनाशकारी होने से पहले अपने डेटाबेस का बैकअप लेने के लिए क्रोनजॉब बनाने की कोशिश कर रहा हूं। ऐसा लगता है कि इस आदेश को मेरी जरूरतों को पूरा करना चाहिए:

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

इसे चलाने के बाद छोड़कर, यह मुझसे एक पासवर्ड टाइप करने की उम्मीद करता है। अगर मैं इसे क्रोन से चलाता हूं तो मैं ऐसा नहीं कर सकता। मैं अपने आप एक कैसे पास कर सकता हूं?


संभवतः सहायक पोस्ट मैंने pg_restore को स्वचालित करने पर लिखा है! medium.com/@trinity/…
kittyminky

यहाँ एक कनेक्शन स्ट्रिंग का उपयोग करके उत्तर दें: stackoverflow.com/a/29101292/1579667
बेंज

जवाबों:


304

.pgpassउस खाते की होम डायरेक्टरी में एक फ़ाइल बनाएँ जो pg_dumpइस प्रकार चलेगी। प्रारूप के विवरण के लिए Postgresql प्रलेखन libpq-pgpass देखें (अंतिम पैराग्राफ सहित जहां यह बताता है कि इसे अनदेखा कर दिया जाएगा यदि आप मोड सेट नहीं करते हैं 0600)।


99
लोकलहोस्ट के साथ ~ / .pg .pass: 5432: mydbname: postgres: mypass फिर chm 600 600 ~ / .pgpass
Mircea Stanciu

6
संभवतः सहायक: उबंटू पर, "सुडो सु पोस्टर्स" को "पोस्टग्रेज" उपयोगकर्ता पर स्विच करने के लिए, फिर .pgpass फ़ाइल बनाएं और डंप को निष्पादित करें।
fivedogit

1
मैंने आपके उत्तर का पालन किया लेकिन फिर भी अपनी बैकअप फ़ाइल को सफलतापूर्वक बनाने में असमर्थ रहा। कृपया मेरा लिंक देखें: unix.stackexchange.com/questions/257898/… । धन्यवाद।
एलिसाएलियाह

9.6.2: ओ) पर काम करता है
एंड्रयू

2
ध्यान दें sudo su postgres: कि यूनिक्स उपयोगकर्ता आवश्यक रूप से मौजूद नहीं है। इसकी जरूरत नहीं है। लेकिन DB उपयोगकर्ता चाहिए।
फाबिन हदादी

217

या स्क्रिप्ट चलाने के लिए आप कॉन्टैब सेट कर सकते हैं। उस स्क्रिप्ट के अंदर आप इस तरह एक पर्यावरण चर सेट कर सकते हैं: export PGPASSWORD="$put_here_the_password"

इस तरह यदि आपके पास कई कमांड्स हैं जिनके लिए आपको पासवर्ड की आवश्यकता होगी तो आप उन्हें स्क्रिप्ट में डाल सकते हैं। यदि पासवर्ड बदलता है तो आपको इसे केवल एक स्थान (स्क्रिप्ट) में बदलना होगा।

और मैं जोशुआ के साथ सहमत हूं, pg_dump -Fcसबसे लचीले निर्यात प्रारूप का उपयोग करता है और पहले से ही संपीड़ित है। अधिक जानकारी के लिए देखें: pg_dump प्रलेखन

उदाहरण के लिए

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

3
यह आदर्श नहीं है। इसे फेंकने .pgpassसे अप्रत्यक्ष की एक अतिरिक्त परत जोड़ने के बिना भी सब कुछ एक ही जगह पर रखा जाएगा। इसके अलावा, अगर सब मैं एक चर निर्यात करना चाहता था, मैं अपनी .bashrcफ़ाइल में, या जो कुछ भी है, वह करूँगा ।
एमपीएन

9
मैं देख सकता हूं कि .pgpassफाइल एक बेहतर समाधान क्यों होगा। मैं सिर्फ एक विकल्प दे रहा था, यह निश्चित नहीं है कि क्या यह एक योग्य है हालांकि :)
मैक्स

13
मैं नीचे नहीं था। वह कोई और था; मैंने नहीं सोचा था कि यह या तो एक डाउनवोट का वारंट है। इसके लिए एक +1 बनाएं।
एमपीएन

7
इतनी नफरत। मैं इस जवाब की सराहना करता हूं और अपने आवेदन के लिए इसे अपना रहा हूं।
जेम्स टी स्नेल

8
PGPASSWORD परिवेश चर सेट करना प्रलेखन द्वारा अनुशंसित अभ्यास नहीं है ( postgresql.org/docs/current/static/libpq-envars.html ): सुरक्षा कारणों से इस पर्यावरण चर का उपयोग अनुशंसित नहीं है, क्योंकि कुछ ऑपरेटिंग सिस्टम गैर की अनुमति देते हैं रूट उपयोगकर्ताओं को ps के माध्यम से प्रक्रिया पर्यावरण चर देखने के लिए; इसके बजाय ~ / .pg फ़ाइल का उपयोग करने पर विचार करें
bouchon

175

यदि आप इसे एक कमांड में करना चाहते हैं:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

27
PGPASSWORD वातावरण चर सेट करना प्रलेखन द्वारा अनुशंसित अभ्यास नहीं है ( postgresql.org/docs/current/static/libpq-envars.html ): सुरक्षा कारणों से इस पर्यावरण चर का उपयोग अनुशंसित नहीं है, क्योंकि कुछ ऑपरेटिंग सिस्टम गैर की अनुमति देते हैं रूट उपयोगकर्ताओं को ps के माध्यम से प्रक्रिया पर्यावरण चर देखने के लिए; इसके बजाय ~ / .pg बाईपास फ़ाइल का उपयोग करने पर विचार करें
बाउच

18
यह अभी भी एक उपयोगी टिप्पणी है। बहुत सारी तैनाती के मामले हैं जहां यह अभी भी मददगार है।
इयान डंकन

1
मुझे हमेशा त्रुटि "पीयर प्रमाणीकरण उपयोगकर्ता" उपयोगकर्ता नाम "के लिए विफल हुई। ' समाधान था: PGPASSWORD = "mypass" pg_dump -U यूज़र -h लोकलहोस्ट> mydb.dump
मार्टिन पाब्स्ट

4
मेरी राय है कि एक ज्ञात, अनएन्क्रिप्टेड स्थान के रूप में पर्यावरण चर (जहां आपका नियंत्रण है, जहां और कैसे पासवर्ड संग्रहीत किया जाएगा) सेट करना बेहतर है । Postgresql doc का यह हिस्सा दोषपूर्ण है, और यह उत्तर एक अच्छा है।
पेटेर - मोनिका

1
मेरे पासवर्ड में एक '@' था। यह काम किया। मैं समझ नहीं सका कि इसे postgres://सिंटैक्स के साथ कैसे काम किया जाए । कोशिश नहीं की .pgpassक्योंकि मेरे पोस्टग्रेजुएट उपयोगकर्ता के पास कोई घर निर्देशिका नहीं है।
जम्मूतवी

136

एक-लाइनर के लिए, एक डेटाबेस को माइग्रेट करने के लिए जैसे आप --dbnameएक कनेक्शन स्ट्रिंग (पासवर्ड सहित) का उपयोग कर सकते हैं जैसा कि pg_dump मैनुअल में कहा गया है

संक्षेप में।

pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase

नोट: सुनिश्चित करें कि आप विकल्प --dbnameको छोटे के बजाय उपयोग करते हैं -dऔर एक वैध यूआरआई उपसर्ग का उपयोग करते हैं, postgresql://या postgres://

सामान्य यूआरआई फॉर्म है:

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

आपके मामले में सबसे अच्छा अभ्यास (क्रोन में दोहराव कार्य) सुरक्षा मुद्दों के कारण ऐसा नहीं किया जाना चाहिए। यदि यह .pgpassफ़ाइल के लिए नहीं था, तो मैं एक पर्यावरण चर के रूप में कनेक्शन स्ट्रिंग को बचाऊंगा।

export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase

तो अपने crontab में है

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz


Postgre का संस्करण 9.1 dbname के लिए एक अज्ञात विकल्प का उत्पादन करता है
akohout

यह क्रमशः आर्क और आरएचईएल पर संस्करणों 9.4 और 9.3 के साथ परीक्षण किया गया था। क्या आप अपना कनेक्शन स्ट्रिंग पोस्ट कर सकते हैं? बेनाम: बेशक।
जोस अलेक्जेंडर इबारा

धन्यवाद, @ जोसुइबरा PostgreSQL 9.3, Ubuntu 14.04 पर सफलतापूर्वक परीक्षण किया गया।
काओ मिन्ह तू

1
@EntryLevelR आपको इसे सहेजने के लिए आउटपुट को फ़ाइल में पाइप करना होगा। इस प्रासंगिक प्रश्न देखें askubuntu.com/questions/420981/...
जोसू अलेक्जेंडर इबारा

4
यह स्वीकृत उत्तर होना चाहिए। एक लाइनर, स्पष्ट।
स्वदेव

48
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

अच्छा है, लेकिन दुख की बात है कि मेरे लिए काम नहीं करता है, मुझे "क्वेरी विफल: ERROR: अनुमति के लिए अनुमति देने से इनकार कर दिया गया है निर्देशन_दृश्य"
जेम्स टी स्नेल

@ क्या आपने pg उपयोगकर्ता को आवश्यक अनुमतियां देने का प्रयास किया है?
फ्रांसिस्को लूज

33

यह एक लाइनर एकल डेटाबेस का डंप बनाते समय मेरी मदद करता है।

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql

1
बहुत मदद की ... thnxxx
रोनित

19

@ जोस अलेक्जेंडर इबारा जवाब सेंटोस 7 और संस्करण 9.5 पर काम करता है अगर --dbname पास नहीं है।

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

1
आप सही कह रहे हैं, कि यह कैसे दिखना चाहिए, मुझे लगता है कि कुछ साल पहले जो गलत था वह मेरा शेल कॉन्फ़िगरेशन था। इसलिए मेरे लिए इसका इस्तेमाल जरूरी था--dbname
जोस अलेक्जेंडर इबारा

7

ध्यान दें कि, विंडोज़ में, pgpass.confफ़ाइल निम्न फ़ोल्डर में होनी चाहिए:

%APPDATA%\postgresql\pgpass.conf

अगर वहाँ नहीं है postgresql अंदर फ़ोल्डर है%APPDATA% , तो इसे बनाएं।

pgpass.confफ़ाइल सामग्री की तरह कुछ है:

localhost:5432:dbname:dbusername:dbpassword

चियर्स


4

यदि मैं गलत हूं तो मुझे सुधारें, लेकिन यदि सिस्टम उपयोगकर्ता डेटाबेस उपयोगकर्ता के समान है, तो PostgreSQL पासवर्ड नहीं मांगेगा - यह प्रमाणीकरण के लिए सिस्टम पर निर्भर करता है। यह कॉन्फ़िगरेशन का मामला हो सकता है।

इस प्रकार, जब मैं चाहता था कि डेटाबेस मालिक postgresहर रात अपने डेटाबेस का बैकअप लें, तो मैं इसके लिए एक कॉन्टैब बना सकता था crontab -e -u postgres:। बेशक, postgresक्रोन नौकरियों को निष्पादित करने की अनुमति देने की आवश्यकता होगी; इस प्रकार यह सूचीबद्ध होना चाहिए /etc/cron.allowया /etc/cron.denyखाली होना चाहिए।


तुम यहीं हो। डिफ़ॉल्ट पोस्टग्रेज कॉन्फ़िगरेशन स्थानीय सिस्टम खातों के लिए TRUST प्रमाणीकरण का उपयोग करता है। हालांकि अधिकांश उत्पादन सेटअप आरडीबीएमएस स्थापित करने के बाद इस ब्लॉक से छुटकारा पा लेते हैं।
जसक प्रुसिया

4

अस्थायी .pg क्रेडेंशियल का उपयोग करके पासवर्ड के साथ ssh पर बैकअप लें और S3 पर पुश करें:

#!/usr/bin/env bash
cd "$(dirname "$0")"

DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"

if [ $# -ne 2 ]; then
    echo "Error: 2 arguments required"
    echo "Usage:"
    echo "  my-backup-script.sh <DB-name> <password>"
    echo "  <DB-name> = The name of the DB to backup"
    echo "  <password> = The DB password, which is also used for GPG encryption of the backup file"
    echo "Example:"
    echo "  my-backup-script.sh my_db my_password"
    exit 1
fi

DATABASE=$1
PASSWORD=$2

echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz

# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg

echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"

echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo

बस आपको जो कुछ भी ज़रूरत है उसके साथ पहले दो पंक्तियों को कॉन्फ़िगर करें। S3 बैकअप भाग में रुचि नहीं रखने वालों के लिए, इसे बाहर निकालें - जाहिर है।

यह स्क्रिप्ट .pgpassबाद में क्रेडेंशियल्स को हटा देती है क्योंकि कुछ वातावरणों में, डिफ़ॉल्ट SSH उपयोगकर्ता पासवर्ड के बिना sudo कर सकता है, उदाहरण के लिए ubuntuउपयोगकर्ता के साथ EC2 उदाहरण , इसलिए .pgpassउन क्रेडेंशियल को सुरक्षित करने के लिए किसी भिन्न होस्ट खाते के साथ उपयोग करना व्यर्थ हो सकता है।


पासवर्ड टर्मिनल के लिए historyइस तरह लॉग इन हो जाएगा , नहीं?
४18 बजे म्पेन

1
@ स्थानीय रूप से, हाँ। दूर से, नहीं। मेरे मामले में मेरे स्थानीय इतिहास में इसका ठीक होना क्योंकि इसका एक सुरक्षित वीएम है जो रिमोट एक्सेस की अनुमति नहीं देता है। यदि आपके मामले में यह ठीक नहीं है, तो बस करें history -c। जेनकिंस के साथ उपयोग करते Inject passwords to the build as environment variablesसमय , विकल्प का उपयोग करें ताकि पासवर्ड नकाब हो
माइक 11

4

के रूप में विस्तृत है इस ब्लॉग पोस्ट , गैर-संवादात्मक तरीके से PostgreSQL उपयोगिताओं के लिए एक पासवर्ड प्रदान करने के दो तरीके हैं जैसे "pg_dump" कमांड: ".pg" फ़ाइल का उपयोग करके या "PGPASSWORD" वैरिएबल चर का उपयोग करना ।


-1

पासवर्ड को पारित करने के लिए एक और (शायद सुरक्षित नहीं) तरीका इनपुट पुनर्निर्देशन अर्थात कॉलिंग का उपयोग कर रहा है

pg_dump [params] < [path to file containing password]


सुरक्षा के बारे में - इस फाइल को केवल इच्छित उपयोगकर्ता द्वारा पठनीय होना चाहिए; हालाँकि, रूट अधिकारों वाला कोई भी व्यक्ति सुरक्षा सेटिंग्स को बदल सकता है, और इस प्रकार अनएन्क्रिप्टेड पासवर्ड को पढ़ सकता है। तो हाँ, यह असुरक्षित है ...
टोबियास

3
@ टोबियास का कोई विकल्प है? ऐसा लगता है कि रूट अधिकारों वाला कोई भी व्यक्ति हमेशा पासवर्ड देख सकता है चाहे वह कोई भी तकनीक हो जो पासवर्ड को अंतःक्रियात्मक रूप से दर्ज करने के अलावा है (और प्रश्न क्रोन के बारे में है)। postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTH में GSSAPI को सिंगल साइन-ऑन का समर्थन करने का उल्लेख किया गया है, लेकिन कोई उल्लेख नहीं है अगर यह गैर-संवादात्मक रूप से काम करता है।
रॉस ब्रैडबरी

4
रूट अधिकार वाला कोई भी व्यक्ति .pg को पढ़ सकता है जो अनुशंसित तरीका है। इसलिए, मैं रूट एक्सेस को सुरक्षा जोखिम नहीं मानूंगा।
अधिकतम

-1

आप निम्नलिखित का उपयोग करके सीधे pg_dump में एक पासवर्ड दे सकते हैं:

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql

ढेर अतिप्रवाह में आपका स्वागत है! जबकि आपका जवाब काम कर सकता है, इसमें गंभीर सुरक्षा निहितार्थ हैं। कमांड के तर्क ps (1) में दिखाई देते हैं , इसलिए यदि कोई प्रक्रिया ps (1) पर नजर रखती है तो पासवर्ड से समझौता किया जाता है।
जोनाथन रोजा

-4

मेरी राय में सबसे आसान तरीका, यह है: आप मुख्य संपादन विन्यास फाइल को संपादित करते हैं: pg_hba.conf आपको निम्नलिखित पंक्ति जोड़नी होगी:

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

और इसके बाद आपको इस प्रकार शुरू करना होगा:

pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz

और यह पासवर्ड के बिना काम किया


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