আমি কীভাবে পিএসকিএল কল করতে পারি যাতে এটি একটি পাসওয়ার্ডের জন্য অনুরোধ না করে ?
এটি আমার কাছে রয়েছে:
psql -Umyuser < myscript.sql
তবে, পাসওয়ার্ডটি পাস করার যুক্তিটি আমি খুঁজে পেলাম না এবং তাই পিএসকিএল সর্বদা এটির জন্য অনুরোধ জানায়।
আমি কীভাবে পিএসকিএল কল করতে পারি যাতে এটি একটি পাসওয়ার্ডের জন্য অনুরোধ না করে ?
এটি আমার কাছে রয়েছে:
psql -Umyuser < myscript.sql
তবে, পাসওয়ার্ডটি পাস করার যুক্তিটি আমি খুঁজে পেলাম না এবং তাই পিএসকিএল সর্বদা এটির জন্য অনুরোধ জানায়।
উত্তর:
PostgreSQL এ অনুমোদনের বেশ কয়েকটি উপায় রয়েছে। আপনি https://www.postgresql.org/docs/current/static/client-authentication.html এ পাসওয়ার্ড প্রমাণীকরণের বিকল্পগুলি অনুসন্ধান করতে পারেন ।
আপনার প্রশ্নের উত্তর দেওয়ার জন্য, পাসওয়ার্ড ভিত্তিক প্রমাণীকরণের জন্য কয়েকটি পাসওয়ার্ড সরবরাহ করা আছে। স্পষ্ট উপায় পাসওয়ার্ড প্রম্পট মাধ্যমে হয়। এর পরিবর্তে, আপনি একটি পগপাস ফাইলে বা 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'
the / .pgpass ফাইলটিতে আপনি যে ইনপুট দিয়েছিলেন সেগুলি মানগুলির সাথে মেলে।. ~/.bashrc
বা অনুরূপ উত্স করুন ।নোট করুন যে আপনার যদি রফতানি পিজিপিএএসডওয়ার্ড = '' ভেরিয়েবল সেট থাকে তবে ফাইলের চেয়ে এটি অগ্রাধিকার গ্রহণ করবে।
chmod 600
ফাইলটিতে একটি করতে হবে, অন্যথায় psql
নীরবে এটিকে উপেক্ষা করবেন (ডক্স অনুসারে)।
এটি একটি পুরানো প্রশ্ন হতে পারে, তবে এমন একটি বিকল্প পদ্ধতি আছে যা আপনি ব্যবহার করতে পারেন যা কেউ উল্লেখ করেনি। ইউআরআই সংযোগে সরাসরি পাসওয়ার্ড নির্দিষ্ট করা সম্ভব। ডকুমেন্টেশন এখানে পাওয়া যাবে , বিকল্পভাবে এখানে ।
ইউআরআই সরবরাহ করা সংযোগে আপনি সরাসরি আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড সরবরাহ করতে পারেন 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 দেখুন।
পিজিপিএএসডওয়ার্ড এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার সম্পর্কে সুরক্ষার উদ্বেগগুলি দেওয়া, আমি মনে করি সর্বোত্তম সামগ্রিক সমাধান নীচে দেওয়া হয়েছে:
এখানে নোট দুটি দফা আছে। ব্যবহারকারীর ~ / .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
যারা * নিক্স শেল স্ক্রিপ্টিং দিয়ে স্বাচ্ছন্দ্য বোধ করবেন না তাদের জন্য শক্তিশালী জবাবের বিল্ডিং এখানে একটি কার্যনির্বাহী স্ক্রিপ্ট:
#!/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 এ আপনি ব্যবহার করতে হবে না -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.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 এর জন্য -w বিকল্পটি নির্দিষ্ট করতে পারেন।