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চলবে। ফর্ম্যাটটির বিশদ জানতে পোস্টগ্রেস্কল ডকুমেন্টেশন লিবপিকিউ-পিজপাাস দেখুন (শেষ অনুচ্ছেদ সহ যেখানে এটি মোড সেট না করে থাকলে তা উপেক্ষা করা হবে 0600) সহ দেখুন।


98
লোকালহোস্ট সহ ~ / .pgpass তৈরি করুন: 5432: mydbname: postgres: mypass তারপরে chmod 600 ~ / .pgpass
মিরিসা স্ট্যানসিউ

6
সম্ভবত সহায়ক: উবুন্টুতে, "পোস্টগ্রিস" ব্যবহারকারীর কাছে যেতে "sudo su postgres", তারপরে .pgpass ফাইলটি তৈরি করুন এবং ডাম্পটি কার্যকর করুন exec
পাঁচডোগিট

1
আমি আপনার উত্তর অনুসরণ করেছি কিন্তু এখনও আমার ব্যাকআপ ফাইলটি সফলভাবে তৈরি করতে পারিনি। অনুগ্রহ করে আমার লিঙ্কটি দেখুন: unix.stackexchange.com/questions/257898/… । ধন্যবাদ.
alyssaeliyah

9.6.2: o) এ কাজ করে
অ্যান্ড্রু

2
সম্পর্কে দ্রষ্টব্য sudo su postgres: ইউনিক্স ব্যবহারকারী অগত্যা উপস্থিত নেই। এটি করার দরকার নেই। তবে ডিবি ব্যবহারকারীর উচিত।
ফ্যাবিয়েন হাদাদাদি 3'50 এ 3'18

216

অথবা আপনি কোনও স্ক্রিপ্ট চালানোর জন্য ক্রন্টব সেটআপ করতে পারেন। সেই স্ক্রিপ্টের অভ্যন্তরে আপনি এই জাতীয় পরিবেশ পরিবর্তনশীল সেট করতে পারেন: 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
পিজিপিএএসডাব্লুড এনভায়রনমেন্ট ভেরিয়েবল সেট করা ডকুমেন্টেশনের দ্বারা প্রস্তাবিত অনুশীলন নয় ( postgresql.org/docs/current/static/libpq-envars.html ): সুরক্ষা কারণে এই পরিবেশের পরিবর্তনশীল ব্যবহারের প্রস্তাব দেওয়া হয় না, কারণ কিছু অপারেটিং সিস্টেম অ-মঞ্জুরি দেয় মূল ব্যবহারকারীরা পিএস এর মাধ্যমে প্রক্রিয়া পরিবেশের ভেরিয়েবলগুলি দেখতে পাবেন; পরিবর্তে ~ / .pgpass ফাইল ব্যবহার করে বিবেচনা
bouchon

175

যদি আপনি এটি একটি আদেশে করতে চান:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

27
পিজিপিএএসডাব্লুড এনভায়রনমেন্ট ভেরিয়েবল সেট করা ডকুমেন্টেশনের দ্বারা প্রস্তাবিত অনুশীলন নয় ( postgresql.org/docs/current/static/libpq-envars.html ): সুরক্ষা কারণে এই পরিবেশের পরিবর্তনশীল ব্যবহারের প্রস্তাব দেওয়া হয় না, কারণ কিছু অপারেটিং সিস্টেম অ-মঞ্জুরি দেয় মূল ব্যবহারকারীরা পিএস এর মাধ্যমে প্রক্রিয়া পরিবেশের ভেরিয়েবলগুলি দেখতে পাবেন; পরিবর্তে ~ / .pgpass ফাইল ব্যবহার করে বিবেচনা
bouchon

18
এটি এখনও একটি দরকারী মন্তব্য। প্রচুর স্থাপনার কেস রয়েছে যেখানে এটি এখনও সহায়ক।
আইয়েন ডানকান

1
আমি সর্বদা ত্রুটি পেয়েছিলাম 'পিয়ার প্রমাণীকরণ ব্যবহারকারী "ব্যবহারকারীর নাম" এর জন্য ব্যর্থ। সমাধানটি ছিল: পিজিপিএএসডব্লর্ড = "মাইপাস" পিজি_ডাম্প-ইউ ব্যবহারকারীর নাম - স্থানীয় লোকাল> মাইডিবি.ডম্প
মার্টিন পাবস্ট

4
আমার অভিমত হ'ল একটি পরিচিত, এনক্রিপ্ট না করা স্থানে যেমন পরিবেশের পরিবর্তনশীল (যেখানে আপনার নিয়ন্ত্রণ রয়েছে, পাসওয়ার্ডটি কোথায় এবং কীভাবে সংরক্ষণ করা হবে) স্থাপন করা আরও ভাল । পোস্টগ্র্যাস্কল ডকের এই অংশটি ত্রুটিযুক্ত এবং এই উত্তরটি একটি ভাল।
পিটারহ - মনিকা পুনরায় ইনস্টল করুন

1
আমার পাসওয়ার্ডটির একটি '@' ছিল। এটি কাজ করে। postgres://সিনট্যাক্স দিয়ে কীভাবে এটি কাজ করা যায় তা আমি বুঝতে পারি না । চেষ্টা করিনি .pgpassকারণ আমার পোস্টগ্রিস ব্যবহারকারীর কোনও হোম ডিরেক্টরি নেই।
জামাতেজে

136

ওয়ান-লাইনারের জন্য, যেমন একটি ডাটাবেস স্থানান্তরিত করার মতো আপনি --dbnameসংযুক্তি স্ট্রিং (পাসওয়ার্ড সহ) ব্যবহার করতে পারেন যেমন উল্লিখিত হয়েছে পিগ_ডাম্প ম্যানুয়ালটিতে

সংক্ষেপে।

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

তারপরে আপনার ক্রোনটেব এ থাকুন

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


পোস্টগ্রের 9.1 সংস্করণ dbname এর জন্য একটি অজানা বিকল্পকে আউটপুট দেয়
akohout

এটি যথাক্রমে খিলান এবং আরএইচইএলে 9.4 এবং 9.3 সংস্করণ দিয়ে পরীক্ষা করা হয়েছিল। আপনি কি আপনার সংযোগের স্ট্রিং পোস্ট করতে পারেন? অবশ্যই বেনামে।
জোসে আলেকজান্ডার ইবাররা

ধন্যবাদ, @ জোসেয়েবাররা। পোস্টগ্র্রেএসকিউএল 9.3, উবুন্টু 14.04 এ সফলভাবে পরীক্ষিত।
Cao Minh Tu

1
@ এন্ট্রিলিভেলআর সংরক্ষণ করতে আপনার আউটপুটটি কোনও ফাইলের কাছে পাইপ করতে হবে। এই প্রাসঙ্গিক প্রশ্নটি দেখুন জিজ্ঞাসা
জোসে আলেকজান্ডার ইবাররা

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। একটি লাইনার, পরিষ্কার।
swdev

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

চমৎকার, তবে দুঃখের সাথে আমার পক্ষে কাজ করে না, আমি পেয়েছি "ক্যোয়ারী ব্যর্থ হয়েছে: ত্রুটি: সম্পর্কের জন্য অনুমতি প্রত্যাখ্যান করা হয়েছে"
জেমস টি স্নেল

@ ডক আপনি কি পিজি ব্যবহারকারীকে প্রয়োজনীয় অনুমতি দেওয়ার চেষ্টা করেছেন?
ফ্রান্সিসকো লুজ

33

একটি একক ডাটাবেসের ডাম্প তৈরি করার সময় এই এক লাইনার আমাকে সহায়তা করে।

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

1
অনেক সাহায্য করেছে ... thnxxx
11:59

19

@ জোস আলেকজান্ডার ইবাররা উত্তরটি সেন্টোস 7 এবং 9d সংস্করণে কাজ করে --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

আমি ভুল হলে আমাকে সংশোধন করুন, তবে যদি সিস্টেম ব্যবহারকারী ডাটাবেস ব্যবহারকারীর মতো হয় তবে পোস্টগ্র্যাসকিউএল পাসওয়ার্ড জিজ্ঞাসা করবে না - এটি প্রমাণীকরণের জন্য সিস্টেমে নির্ভর করে। এটি কনফিগারেশনের বিষয় হতে পারে।

সুতরাং, যখন আমি ডাটাবেসের মালিক চেয়েছিলেন postgresপ্রতি রাতে ব্যাকআপ তার ডাটাবেস, আমি এটির জন্য একটি নিম্নলিখিতরূপে crontab পরিবর্তন তৈরি করা যায়নি: crontab -e -u postgres। অবশ্যই postgresক্রোন চাকরি সম্পাদনের অনুমতি দেওয়া দরকার; সুতরাং এটি অবশ্যই তালিকাভুক্ত করা উচিত /etc/cron.allow, বা /etc/cron.denyঅবশ্যই খালি থাকতে হবে।


আপনি ঠিক এখানে সাজান। ডিফল্ট পোস্টগ্রিজ কনফিগারেশন স্থানীয় সিস্টেম অ্যাকাউন্টগুলির জন্য TRUST প্রমাণীকরণ ব্যবহার করে। তবে বেশিরভাগ প্রোডাকশন সেটআপগুলি আরডিবিএমএস ইনস্টল করার পরে এই ব্লকটি থেকে মুক্তি পান।
জেসেক প্রুশিয়া

4

অস্থায়ী .pgpass শংসাপত্রগুলি ব্যবহার করে পাসওয়ার্ড সহ এসএসএস-এর ব্যাকআপ এবং এস 3-তে চাপ দিন:

#!/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

আপনার যা প্রয়োজন ঠিক তা দিয়ে কেবল প্রথম দু'টি কনফিগার লাইনের বিকল্প দিন। যারা এস 3 ব্যাকআপ অংশে আগ্রহী নন তাদের পক্ষে এটি ব্যবহার করুন - স্পষ্টতই।

এই স্ক্রিপ্টটি .pgpassপরে শংসাপত্রগুলি মুছে দেয় কারণ কিছু পরিবেশে, ডিফল্ট এসএসএইচ ব্যবহারকারী কোনও পাসওয়ার্ড ছাড়াই sudo করতে পারে, উদাহরণস্বরূপ ubuntuব্যবহারকারীর সাথে একটি EC2 উদাহরণস্বরূপ , .pgpassএই শংসাপত্রগুলি সুরক্ষিত করার জন্য একটি পৃথক হোস্ট অ্যাকাউন্ট ব্যবহার করা অর্থহীন হতে পারে।


পাসওয়ার্ড historyএভাবে টার্মিনালে লগ হবে , না?
এমপেন

1
স্থানীয়ভাবে @ হ্যাঁ। দূর থেকে, না। আমার ক্ষেত্রে আমার স্থানীয় ইতিহাসে থাকা ঠিক আছে কারণ এটির সুরক্ষিত ভিএম যা দূরবর্তী অ্যাক্সেসের অনুমতি দেয় না। আপনার ক্ষেত্রে যদি তা ঠিক না থাকে তবে কেবল করুন history -c। জেনকিন্সের সাথে ব্যবহারের সময়, Inject passwords to the build as environment variablesবিকল্পটি ব্যবহার করুন যাতে পাসওয়ার্ডটি মুখোশযুক্ত হয়
মাইকেএম

4

এই ব্লগ পোস্টে বিশদ হিসাবে , পোস্টগ্রিএসকিউএল ইউটিলিটিগুলিতে "pg_dump" কমান্ডের মতো ইন্টারেক্টিভভাবে পাসওয়ার্ড সরবরাহ করার দুটি উপায় রয়েছে: ".pgpass" ফাইলটি ব্যবহার করে বা "PGPASSWORD" পরিবেশ পরিবর্তনশীল ব্যবহার করে ।


-1

পাসওয়ার্ড পাস করার জন্য আরেকটি (সম্ভবত নিরাপদ নয়) উপায় হ'ল ইনপুট পুনঃনির্দেশক অর্থাৎ কলিং

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


সুরক্ষা সম্পর্কিত - এই ফাইলটি কেবলমাত্র ব্যবহারকারীদের দ্বারা পঠনযোগ্য হবে; তবে, মূল অধিকার সহ যে কেউ সুরক্ষা সেটিংস পরিবর্তন করতে এবং এভাবে এনক্রিপ্ট না করা পাসওয়ার্ডটি পড়তে সক্ষম হবে। তো হ্যাঁ, এটি অনিরাপদ ...
টোবিয়াস

3
@ টোবিয়াস এর কোন বিকল্প আছে? এটি দেখে মনে হবে যে মূল অধিকার সহ যে কেউ সর্বদা পাসওয়ার্ডটি দেখতে পাবে পাসওয়ার্ডটি ইন্টারেক্টিভভাবে প্রবেশ করা ছাড়া অন্য কোন কৌশল (এবং প্রশ্নটি ক্রোন সম্পর্কিত)। postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTH GSSAPI- কে একক সাইন-অনকে সমর্থন করার কথা উল্লেখ করেছে তবে তা যদি ইন্টার-ইন্টারেক্টিভভাবে কাজ করে তবে কোনও উল্লেখ নেই।
রস ব্র্যাডবেরি

4
মূল অধিকার সহ যে কোনও ব্যক্তি .pgpass পড়তে পারেন যা প্রস্তাবিত উপায়। অতএব, আমি রুট অ্যাক্সেসটিকে কোনও সুরক্ষা ঝুঁকি বিবেচনা করব না।
সর্বাধিক

-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

এবং এটি পাসওয়ার্ড ছাড়াই কাজ করে


এবং আপনি কেবল সিস্টেমের সুরক্ষা ধ্বংস করেছেন। একটি দেব বাক্সের জন্য ঠিক আছে, তবে কিছুই নয়।
থিওডোর আর স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.