Postgresql: পাসওয়ার্ড সহ স্ক্রিপ্টিং পিএসকিএল সম্পাদন execution


274

আমি কীভাবে পিএসকিএল কল করতে পারি যাতে এটি একটি পাসওয়ার্ডের জন্য অনুরোধ না করে ?

এটি আমার কাছে রয়েছে:

psql -Umyuser < myscript.sql

তবে, পাসওয়ার্ডটি পাস করার যুক্তিটি আমি খুঁজে পেলাম না এবং তাই পিএসকিএল সর্বদা এটির জন্য অনুরোধ জানায়।


4
আমি পিজিপিএএসডওয়ার্ড এনভায়রনমেন্ট ভেরিয়েবলের জন্য শেষ করেছি। এটি আমার ইউসকেসকে পুরোপুরি ফিট করে। লিপিটিতে সরল এবং স্ব-অন্তর্ভুক্ত।
এক্সেল ফন্টেইন

শুধু এই পাওয়া postgresguide.com/utilities/psql.html
D_C

উত্তর:


315

PostgreSQL এ অনুমোদনের বেশ কয়েকটি উপায় রয়েছে। আপনি https://www.postgresql.org/docs/current/static/client-authentication.html এ পাসওয়ার্ড প্রমাণীকরণের বিকল্পগুলি অনুসন্ধান করতে পারেন ।

আপনার প্রশ্নের উত্তর দেওয়ার জন্য, পাসওয়ার্ড ভিত্তিক প্রমাণীকরণের জন্য কয়েকটি পাসওয়ার্ড সরবরাহ করা আছে। স্পষ্ট উপায় পাসওয়ার্ড প্রম্পট মাধ্যমে হয়। এর পরিবর্তে, আপনি একটি পগপাস ফাইলে বা PGPASSWORDএনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে পাসওয়ার্ড সরবরাহ করতে পারেন । এগুলি দেখুন:

কমান্ড লাইন আর্গুমেন্ট হিসাবে পাসওয়ার্ড সরবরাহ করার কোনও বিকল্প নেই কারণ সেই তথ্যটি সমস্ত ব্যবহারকারীদের কাছে প্রায়শই উপলব্ধ থাকে এবং তাই অনিরাপদ। তবে লিনাক্স / ইউনিক্স পরিবেশে আপনি এই জাতীয় একক কমান্ডের জন্য পরিবেশ পরিবর্তনশীল সরবরাহ করতে পারেন:

PGPASSWORD=yourpass psql ...

11
আমি মনে করি পিজিপিএএসডওয়ার্ডকে অবমূল্যায়িত করা হয়েছে তবে এখনও বিটিডব্লিউ কাজ করে। জাস্ট এফওয়াইআই
স্কট মার্লো

35
হ্যাঁ, এটি অবহেলা করা হয়েছে (এবং এর লিঙ্কগুলির মধ্যে একটিতে উল্লিখিত)। যেহেতু এটি প্রকাশিত হয়েছে, সম্ভবত এটিও লক্ষণীয় যে অবচয়টি তীব্রভাবে প্রতিদ্বন্দ্বিতা করা হয়েছে কারণ এটি গুরুতর সুরক্ষা উদ্বেগ ছাড়াই কিছু পরিস্থিতিতে ব্যবহার করা যেতে পারে এমন অনেকের পক্ষে এটি অত্যন্ত কার্যকর। এটি আমার কাছে মনে হয় এটি কোনও এনএফএস ফাইল সিস্টেমে .pgpass সংরক্ষণের চেয়ে খারাপ নয়। আমি পিজিপিএএসডওয়ার্ডটি নিয়মিত ব্যবহার করি।
রিস

1
কমান্ড লাইনের তথ্য "সমস্ত ব্যবহারকারীদের জন্য উপলব্ধ" ধারণাটি বহু-ব্যবহারকারী সিস্টেমগুলি সম্পর্কে পুরানো অনুমানের উপর ভিত্তি করে এবং বেশিরভাগ আধুনিক পরিবেশে প্রয়োগ হয় না যেখানে সিস্টেমগুলি কেবল একটি একক অ্যাপ্লিকেশন চালায় এবং এটি সমস্ত স্বয়ংক্রিয়ভাবে রয়েছে
অ্যালেক্স আর


67

আপনি আপনার স্ক্রিপ্টের শুরুতে এই কমান্ড লাইনটি যুক্ত করতে পারেন:

set PGPASSWORD=[your password]

24
আমার ক্ষেত্রে সেট কমান্ড কাজ করে নি তবে export PGPASSWORD=[password]কাজ করেছে
Kavaklıoğlu

এটি শেল স্ক্রিপ্টে কাজ করে না। আমি এটি ব্যবহার করছি #!/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. আপনার বাশ প্রোফাইলে এমন একটি উপাধি তৈরি করুন যা আপনার জন্য আপনার পিএসকিএল কমান্ড চালায়। উদাহরণস্বরূপ: alias postygresy='psql --host hostname database_name -U username'the / .pgpass ফাইলটিতে আপনি যে ইনপুট দিয়েছিলেন সেগুলি মানগুলির সাথে মেলে।
  4. আপনার বাশ প্রোফাইলটি এর সাথে . ~/.bashrcবা অনুরূপ উত্স করুন ।
  5. কমান্ড লাইন থেকে আপনার নাম লিখুন।

নোট করুন যে আপনার যদি রফতানি পিজিপিএএসডওয়ার্ড = '' ভেরিয়েবল সেট থাকে তবে ফাইলের চেয়ে এটি অগ্রাধিকার গ্রহণ করবে।


1
আপনাকে অবশ্যই chmod 600ফাইলটিতে একটি করতে হবে, অন্যথায় psqlনীরবে এটিকে উপেক্ষা করবেন (ডক্স অনুসারে)।
রিচভেল

33

এটি একটি পুরানো প্রশ্ন হতে পারে, তবে এমন একটি বিকল্প পদ্ধতি আছে যা আপনি ব্যবহার করতে পারেন যা কেউ উল্লেখ করেনি। ইউআরআই সংযোগে সরাসরি পাসওয়ার্ড নির্দিষ্ট করা সম্ভব। ডকুমেন্টেশন এখানে পাওয়া যাবে , বিকল্পভাবে এখানে

ইউআরআই সরবরাহ করা সংযোগে আপনি সরাসরি আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড সরবরাহ করতে পারেন psql:

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

2
পোস্টগ্র্রেস 9.3 পরিবেশের পরিবর্তনশীলটিকে উপেক্ষা করেPGPASSWORD
ডেভিড.প্রেজ

14

আমার মতো উইন্ডোতে যদি আপনার সমস্যা হয় (আমি উইন্ডোজ 7 64-বিট ব্যবহার করছি) এবং set PGPASSWORD=[Password]কাজ করে না।

তারপরে, যেমন কাভাক্লিয়লগ্লু একটি মন্তব্যে বলেছিলেন,

export PGPASSWORD=[password]

আপনাকে এটিকে ফাইলের শীর্ষে বা কোনও ব্যবহারের আগে সেভ করতে হবে যাতে ডাকা হওয়ার আগে এর সেট।

অবশ্যই উইন্ডোতে কাজ করে :)


1
export PGPASSWORD=[password]কমান্ড লাইন (cmd.exe) মোটেও ব্যবহার করে আমার পক্ষে কাজ করে না। আপনি কি নিশ্চিত যে আপনি সাইগউইন বা অনুরূপ কিছু ব্যবহার করছিলেন না?
ডেভিন স্নাইডার

শুধুমাত্র ক্লিলে কাজ করে, আপনি কি এটি ঠিক ফাইলটিতে যুক্ত করেছেন? এখন এটি কমান্ড টাইপ?
জেমি হাটবার

এটি লিনাক্স / ম্যাক পরিবেশে ব্যবহার করা ঠিক আছে, উইন্ডোগুলির জন্য, আমি মনে করি আপনার এই পরিবেশের পরিবর্তনশীল রফতানির জন্য কোনও উপায় খুঁজে পাওয়া উচিত।
Pengfei.X

সুতরাং একটি বিশ্বব্যাপী পাসওয়ার্ড যুক্ত করুন ... পাশাপাশি একটি আকর্ষণীয় ধারণাও
জেট করুন


7

পিজিপিএএসডওয়ার্ড এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার সম্পর্কে সুরক্ষার উদ্বেগগুলি দেওয়া, আমি মনে করি সর্বোত্তম সামগ্রিক সমাধান নীচে দেওয়া হয়েছে:

  1. আপনি যে পাসওয়ার্ডটি ব্যবহার করতে চান তা দিয়ে নিজের অস্থায়ী পগপাস ফাইলটি লিখুন।
  2. সেই ফাইলটি ব্যবহার করতে পিএসকিএলকে বলতে পিজিপিএএসএফআইএল এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন।
  3. অস্থায়ী pgpass ফাইল সরান

এখানে নোট দুটি দফা আছে। ব্যবহারকারীর ~ / .pgpass ফাইলটি যে উপস্থিত থাকতে পারে তার সাথে কৌতুক এড়ানোর জন্য পদক্ষেপ 1 রয়েছে। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে ফাইলটির 0600 বা তারও কম অনুমতি রয়েছে।

কেউ কেউ এটিকে শর্টকাটের জন্য ব্যাশ উপকারের পরামর্শ দিয়েছেন:

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

একটি আসল ফাইলে ডেটা লেখার প্রয়োজন এড়াতে এটি <() সিনট্যাক্স ব্যবহার করে। তবে এটি কাজ করে না কারণ পিএসএইচএল কোন ফাইলটি ব্যবহৃত হচ্ছে তা পরীক্ষা করে এবং এটির মতো ত্রুটি ছুঁড়ে দেয়:

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

এই পদ্ধতির একটি কার্যকারী উদাহরণ স্ট্যাকওভারফ্লো . com /a/ 40614592 / 3696363 এ প্রদর্শিত হবে - এই প্রশ্নের অন্য উত্তর।
এলিয়াহু স্কোকজিলাস

যদিও এই ব্যবহারকারী সত্যই আমি যা খুঁজছি তার জন্য অনুরোধ করেনি, তবে আমি বলব যে পদ্ধতির সাথে মেলে না। পিজিপিএএসএফএফিল = <(যাই হোক না কেন) সিনট্যাক্স ব্যবহার করার সময় আপনি কোনও ফাইল ডিক্রিপ্ট করার মতো কাজ করতে পারেন এবং তৈরি হওয়া ফাইল বিবরণীতে এটি উপস্থিত থাকতে পারেন। একটি টেম্প ফাইল লিখে, আপনি শংসাপত্র সহ ডিস্কে একটি ফাইল থাকার সমস্যাটি মৌলিকভাবে সমাধান করছেন না। শিল্পের মতো স্বেচ্ছাসেবীর নিয়মগুলি মোকাবেলা করা মজাদার নয়, তবে এটি এমন একটি জিনিস যা অনেকেই মোকাবেলা করে।
দেশিদারো

7

এটি পিজিপিএএসওয়ার্ড ব্যবহার করেই করা যেতে পারে। আমি 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৪ নং লাইনে কমান্ডের ব্যবহারটি নোট করুন - " প্লেইন ফাইল নয় " ত্রুটির মতো যা সম্ভবত বর্ণিত হয়েছে, এটি করা না হলে " অনুমতি " ত্রুটি রয়েছে।

লাইন 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পরিবর্তে আমি এটি ব্যবহার করার পরামর্শ দিচ্ছি ।
রিচভেল

ধন্যবাদ, এই ছোট্ট সুরক্ষা গর্তটি দেখানোর জন্য @ রিচভেল। এতে পাসওয়ার্ড রাখার আগে ফাইলটি ব্যক্তিগত তৈরি করা এবং তৈরি করার স্পর্শ একটি সুনির্দিষ্ট উন্নতি। এই ধরণের সমাধানের প্রয়োজন কারণ PGPASSWORD9.3.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


আপনি .pgpass ব্যবহার করেন তবে পিএসকিএল এর জন্য -W ব্যবহার করবেন না। এই পরামিতি .pgpass ব্যবহার বাতিল করে।
এভেনসিস

-1

আমি খুঁজে পাই, যে পিএসএলএল পাসওয়ার্ড প্রম্পট প্রদর্শন করে এমনকি আপনি পিজিপিএএসডওয়ার্ড ভেরিয়েবলকে সংজ্ঞায়িত করে, তবে আপনি পাসওয়ার্ড প্রম্পট বাদ দিতে PSQL এর জন্য -w বিকল্পটি নির্দিষ্ট করতে পারেন।


-6

কমান্ডে -w ব্যবহার করুন: psql -h লোকালহোস্ট -p 5432 -U ব্যবহারকারী -w

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