psql: FATAL: उपयोगकर्ता "देव" के लिए सहकर्मी प्रमाणीकरण विफल


198

जब मैं एक नया उपयोगकर्ता बनाता हूं, लेकिन यह डेटाबेस को लॉगिन नहीं कर सकता है।
मैं ऐसा करता हूं:

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

फिर एक डेटाबेस बनाएँ:

postgres@Aspire:/home/XXX$ createdb -O dev test_development

उसके बाद, मैं psql -U dev -W test_developmentलॉगिन करने की कोशिश करता हूं , लेकिन त्रुटि मिलती है:

psql: FATAL:  Peer authentication failed for user "dev"

मैंने समस्या को हल करने की कोशिश की लेकिन असफल रहा।



अब, उपरोक्त प्रश्नों के उत्तर के लिए आपको --interactiveकमांड में जोड़ने की आवश्यकता है :createuser --interactive joe
user3791372

जवाबों:


310

प्रयत्न:

psql -U user_name  -h 127.0.0.1 -d db_name

कहाँ पे

  • -U डेटाबेस उपयोगकर्ता नाम है
  • -h स्थानीय सर्वर का होस्टनाम / आईपी है, इस प्रकार यूनिक्स डोमेन सॉकेट से बचा जाता है
  • -d से कनेक्ट करने के लिए डेटाबेस का नाम है

इसके बाद यूनिक्स डोमेन सॉकेट कनेक्शन के बजाय Postgresql द्वारा "नेटवर्क" कनेक्शन के रूप में मूल्यांकन किया जाता है, इस प्रकार "स्थानीय" कनेक्ट के रूप में मूल्यांकन नहीं किया जाता है जैसा कि आप में देख सकते हैं pg_hba.conf:

local   all             all                                     peer

15
मुझे जरूरत है (ver 9.4): psql -U यूजर-नेम -h 127.0.0.1 -d db-name
ग्रेगोर

9
क्या एक आभूषण उपकरण है। मैनुअल कहता है psql [option...] [dbname [username]], तो आपको लगता है psql dbname usernameकि बस काम करेगा ..
djeikyb

2
मेरे लिए भी काम किया। मुझे यह भी लगता है कि यह कॉन्फ़िगर फ़ाइलों को बदलने की तुलना में बहुत अधिक बेहतर तरीका है, खासकर जब आपके पास कोई सुराग नहीं है कि आप क्या कर रहे हैं और आपकी समस्या को हल करने के लिए एसओ उत्तर का अनुसरण कर रहे हैं।
बोरिसानो

1
यह मेरे लिए काम करता है, बहुत धन्यवाद, हालांकि मैं एक शोध कर रहा हूं कि यह सही समाधान क्यों था। फिर भी, एक अन्य मशीन में एक विन्यास में मैं psql -U उपयोगकर्ता नाम -d डेटाबेस के रूप में लॉगिन करूंगा। इसलिए मुझे लगता है कि स्वीकृत समाधान मामले पर निर्भर करता है।
लाजर राइजिंग

2
अच्छा उत्तर। मैं postgres रूप में लॉग इन करने के बाद डेटाबेस के अंदर से हो रही थी \c glossary john FATAL: Peer authentication failed for user "john"तो साथ \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".यह काम किया।
देखो

215

आपका कनेक्शन विफल हो गया क्योंकि डिफ़ॉल्ट रूप psqlसे peerप्रमाणीकरण का उपयोग करके UNIX सॉकेट्स पर कनेक्ट होता है , जिसके लिए वर्तमान UNIX उपयोगकर्ता के समान उपयोगकर्ता नाम होना आवश्यक है psql। इसलिए आपको UNIX उपयोगकर्ता बनाना होगा devऔर फिर डेटाबेस तक पहुंचने के लिए लॉगिन devया उपयोग करना चाहिए sudo -u dev psql test_development(और पासवर्ड नहीं पूछना psqlचाहिए )।

यदि आप UNIX उपयोगकर्ता नहीं बना सकते हैं या नहीं बनाना चाहते हैं, जैसे कि यदि आप तदर्थ प्रश्नों के लिए अपने डेटाबेस से कनेक्ट करना चाहते हैं, तो सॉकेट कनेक्शन का उपयोग करने के लिए मजबूर करें psql --host=localhost --dbname=test_development --username=dev(जैसा कि @meyerson उत्तर द्वारा बताया गया है) आपकी तत्काल समस्या का समाधान करेगा।

लेकिन यदि आप सहकर्मी विधि के बजाय यूनिक्स सॉकेट्स पर पासवर्ड प्रमाणीकरण के लिए मजबूर करना चाहते हैं, तो निम्न pg_hba.conf* लाइन बदलने का प्रयास करें :

से

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

सेवा

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peerइसका अर्थ है कि यह UNIX उपयोगकर्ता की पहचान (प्रामाणिकता) पर भरोसा करेगा। इसलिए पासवर्ड नहीं मांग रहा।

  • md5इसका मतलब है कि यह हमेशा पासवर्ड मांगेगा, और हैशिंग के बाद इसे मान्य करेगा MD5

आप निश्चित रूप से एक विशिष्ट डेटाबेस या उपयोगकर्ता के लिए और अधिक विशिष्ट नियम बना सकते हैं, कुछ उपयोगकर्ताओं के पास peerऔर अन्य के लिए पासवर्ड की आवश्यकता होती है।

बदलने के बाद pg_hba.confयदि PostgreSQL चल रहा है, तो आपको इसे पुनः लोड ( pg_ctl reload) या पुनः आरंभ ( sudo service postgresql restart) द्वारा कॉन्फ़िगरेशन को फिर से पढ़ने की आवश्यकता होगी ।

* फ़ाइल pg_hba.confसबसे अधिक संभावना होगी/etc/postgresql/9.x/main/pg_hba.conf

संपादित: @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What टिप्पणियों से उत्तर में शामिल किए गए।


5
कैसे आप की अनुमति नहीं peer है और md5 ? जब मैं सेट करता हूं md5, तब मैं postgresउपयोगकर्ता के साथ लॉगिन नहीं कर सकता हूं ! मैंने कई पंक्तियों को जोड़ने और कॉमा के साथ विधि को अलग करने की कोशिश की, लेकिन उन्होंने काम नहीं किया। ठीक है मुझे mgoldwasserजवाब मिल गया और वह काम कर गया। मैंने अभी postgresविधि के साथ उपयोगकर्ता के लिए एक और लाइन जोड़ी है peer!
क्लो

3
चिंता न करें, आप विशिष्ट उपयोगकर्ताओं (उदाहरण के लिए, आपका उपयोगकर्ता नाम या पोस्टग्रेज) के लिए सहकर्मी प्रमाणीकरण सेट कर सकते हैं। ऐसा लगता है कि विशिष्ट नियम सामान्य नियमों को ओवरराइड करते हैं
जेवियर एचई

1
कुछ वितरणों पर फ़ाइल यहाँ भी मिल सकती है:/var/lib/pgsql/9.4/data/pg_hba.conf
जोनास आइशर

2
आप postgresql को पुनरारंभ किए बिना ऐसा नहीं कर सकते? क्या आप केवल pg_user तालिका में प्रमाणीकरण विधि निर्दिष्ट नहीं कर सकते?
fccoelho

2
आप पुनरारंभ करने के बजाय पुनः लोड कर सकते हैं। यह pg_hba तालिका को पुनः लोड करता है। मेरे लिए काम किया।
जोनिस

29

पीयर प्रमाणीकरण का मतलब है कि पोस्टग्रेज आपके लॉगिन नाम के लिए ऑपरेटिंग सिस्टम पूछता है और प्रमाणीकरण के लिए इसका उपयोग करता है। पोस्टग्रेज पर सहकर्मी प्रमाणीकरण का उपयोग करके उपयोगकर्ता "देव" के रूप में लॉगिन करने के लिए, आपको ऑपरेटिंग सिस्टम पर उपयोगकर्ता "देव" भी होना चाहिए।

आप Postgresql प्रलेखन में प्रमाणीकरण विधियों का विवरण पा सकते हैं

संकेत: यदि कोई प्रमाणीकरण विधि अब काम नहीं करती है, तो नेटवर्क से सर्वर को डिस्कनेक्ट करें और "लोकलहोस्ट" के लिए विधि "ट्रस्ट" का उपयोग करें (और दोहराएं कि आपका सर्वर नेटवर्क के माध्यम से पहुंच योग्य नहीं है जबकि विधि "विश्वास" सक्षम है)।


1
आपके जवाब के लिए धन्यवाद। लेकिन यह अभी भी काम नहीं करता है अगर मैं devसिस्टम उपयोगकर्ता को बदल देता XXX
हूं

2
स्टीफन का जवाब सही है। मैंने अभी एक लिंक जोड़ा है, जो उस समय दिखाई देगा जब मेरे संपादन की समीक्षा की जाती है, दस्तावेज़ीकरण के लिए जहां प्रमाणीकरण विधियों में से प्रत्येक को समझाया गया है।
dsh

25

जब आप निर्दिष्ट करें:

psql -U user

यह UNIX सॉकेट के माध्यम से जोड़ता है, जो डिफ़ॉल्ट रूप से peerप्रमाणीकरण का उपयोग करता है, जब तक कि इसमें निर्दिष्ट न होpg_hba.conf अन्यथा न हो।

आप निर्दिष्ट कर सकते हैं:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

निर्दिष्ट के लिए लूपबैक इंटरफ़ेस (दोनों IPv4 और IPv6) पर टीसीपी / आईपी कनेक्शन प्राप्त करने के लिए databaseऔरuser

परिवर्तनों के बाद आपको पोस्टग्रेज को फिर से शुरू करना होगा या इसे फिर से लोड करना होगा। पुनरारंभ करें कि आधुनिक आरएचईएल / डेबियन आधारित डिस्ट्रोस में काम करना चाहिए:

service postgresql restart

रीलोड को निम्नलिखित तरीके से काम करना चाहिए:

pg_ctl reload

लेकिन PATH कॉन्फ़िगरेशन के आधार पर कमांड अलग-अलग हो सकती है - आपको निरपेक्ष पथ निर्दिष्ट करना पड़ सकता है, जो भिन्न हो सकता है, जिस तरह से पोस्टग्रेज स्थापित किए गए थे।

तो आप का उपयोग कर सकते हैं:

psql -h localhost -U user -d database

टीसीपी / आईपी पर userनिर्दिष्ट के साथ लॉगिन करने के लिए databasemd5एन्क्रिप्टेड पासवर्ड के लिए खड़ा है, जबकि आप passwordप्राधिकरण के दौरान सादे पाठ पासवर्ड के लिए भी निर्दिष्ट कर सकते हैं । जब तक डेटाबेस सर्वर केवल स्थानीय रूप से सुलभ है, तब तक इन 2 विकल्पों का कोई बड़ा मामला नहीं होना चाहिए, जिसमें कोई नेटवर्क एक्सेस न हो।

महत्वपूर्ण नोट:pg_hba.conf मामलों में परिभाषा के आदेश - नियम ऊपर से नीचे तक पढ़े जाते हैं, जैसे कि iptables, इसलिए आप संभवत: प्रस्तावित नियमों को जोड़ना चाहते हैं:

host    all             all             127.0.0.1/32            ident

महत्वपूर्ण नोट फिर से: - आदेश महत्वपूर्ण है +1
हॉकआई

23

जबकि @ flaviodesousa का जवाब काम करेगा, यह सभी उपयोगकर्ताओं (अन्य सभी) के लिए पासवर्ड दर्ज करना भी अनिवार्य बनाता है।

शायद ही कभी यह सभी के लिए सहकर्मी प्रमाणीकरण रखने के लिए समझ में आता है, लेकिन एक सेवा उपयोगकर्ता के लिए एक अपवाद बनाते हैं। उस स्थिति में आप pg_hba.conf में एक पंक्ति जोड़ना चाहेंगे जो इस प्रकार है:

local   all             some_batch_user                         md5

मैं आपको सलाह दूंगा कि आप इस लाइन को टिप्पणी हेडर लाइन के ठीक नीचे जोड़ दें:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

आपको PostgreSQL का उपयोग करके पुनः आरंभ करने की आवश्यकता होगी

sudo service postgresql restart

यदि आप 9.3 का उपयोग कर रहे हैं, तो आपका pg_hba.conf सबसे अधिक संभावना होगा:

/etc/postgresql/9.3/main/pg_hba.conf


12

यह मेरे लिए काम करता है जब मैं इसमें भाग लेता हूं:

sudo -u username psql

तभी काम करता है आप सिस्टम पर और postgres में एक नया उपयोगकर्ता बना सकते हैं - hsming सिर्फ नव निर्मित postgres उपयोगकर्ता के साथ postgres से कनेक्ट करना चाहता, dev
केनेथ

8

सबसे आसान उपाय:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;

6

मुझे बस जोड़ना था -h localhost


मेरा मुद्दा एक रास्पबेरी पर पोस्टग्रेज का उपयोग कर रहा था। ^ ^ ^ मेरे लिए काम किया !! धन्यवाद!
tidydee

2

मेरे मामले में मैं अलग पोर्ट का उपयोग कर रहा था। डिफ़ॉल्ट 5432 है। मैं 5433 का उपयोग कर रहा था। यह मेरे लिए काम कर रहा है:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

जब आप पोस्टग्रेज की एक से अधिक स्थापना करते हैं, तो यह स्वचालित रूप से घट सकता है।
गलगेटर

1

भविष्य में इस को देखने में लोगों के लिए, postgresमें है /usr/lib/postgresql/10/binमेरी Ubuntu सर्वर पर।

मैंने इसे अपने .bashrc फ़ाइल में PATH में जोड़ा, और अंत में इस पंक्ति को जोड़ दिया

PATH=$PATH:/usr/lib/postgresql/10/bin

फिर कमांड लाइन पर

$> source ./.bashrc

मैंने अपने बैश वातावरण को ताज़ा किया। अब मैं postgres -D /whereverकिसी भी डायरेक्टरी से उपयोग कर सकता हूं


1

pg_dump -h localhost -U पोस्टग्रेजेस -F c -b -v -f mydb.backup mydb


इस सवाल का क्या जवाब है? क्यों -U postgresमहत्वपूर्ण हो सकता है? वैसे भी वे सभी डैश-अक्षर क्या हैं ?
ग्रेबर्ड

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