ได้รับข้อผิดพลาด: การรับรองความถูกต้องแบบเพียร์ล้มเหลวสำหรับผู้ใช้“ postgres” เมื่อพยายามให้ pgsql ทำงานกับราง


737

ฉันได้รับข้อผิดพลาด:

FATAL: Peer authentication failed for user "postgres"

เมื่อฉันพยายามทำให้ postgres ทำงานกับ Rails

นี่คือของฉันpg_hba.confของฉันdatabase.ymlและการถ่ายโอนข้อมูลของร่องรอยเต็ม

ฉันเปลี่ยนการรับรองความถูกต้องเป็น md5 ใน pg_hba และลองสิ่งต่าง ๆ แต่ดูเหมือนจะไม่มีอะไรทำงาน

ฉันพยายามสร้างผู้ใช้และฐานข้อมูลใหม่ตามRails 3.2, FATAL: การตรวจสอบสิทธิ์ของผู้ใช้ล้มเหลวสำหรับผู้ใช้ (PG :: Error)

แต่พวกเขาจะไม่แสดงขึ้นบน pgAdmin sudo -u postgres psql -lหรือแม้กระทั่งตอนที่ผมทำงาน

ความคิดใดที่ฉันจะผิด


1
1):ตรวจสอบให้แน่ใจว่าคุณมีผู้ใช้ชื่อ "postgres" ที่สร้างขึ้นและมีสิทธิในฐานข้อมูลของคุณ2):ตรวจสอบให้แน่ใจว่าเขามีรหัสผ่านที่3):ตรวจสอบให้แน่ใจปรับแต่งของคุณ / database.yml มีข้อมูลประจำตัวของสิทธิมนุษยชน (ชื่อผู้ใช้รหัสผ่าน +)
MrYoshiji

2
ต้องการเพียร์ทุกจุดและเยื้องตั้ง md5
Artem.Borysov

13
ดูยังคำตอบนี้ - การเชื่อมต่ออาจล้มเหลวในแต่ประสบความสำเร็จในlocalhost 127.0.0.1
uvsmtid

9
ในกรณีของฉันฉันจำเป็นต้องเพิ่มhost: localhostในdatabase.ymlไฟล์
Mihail Velikov

ลิงค์นี้ช่วยให้ฉันsuite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/ ......
Sudip Bhandari

คำตอบ:


1027

ปัญหายังคงเป็นpg_hba.confไฟล์ของคุณ( /etc/postgresql/9.1/main/pg_hba.conf*)

สายนี้:

local   all             postgres                                peer

ควรจะเป็น:

local   all             postgres                                md5

* หากคุณไม่พบไฟล์นี้การรันlocate pg_hba.confควรแสดงให้คุณเห็นว่าไฟล์อยู่ที่ไหน

หลังจากแก้ไขไฟล์นี้อย่าลืมรีสตาร์ทเซิร์ฟเวอร์ PostgreSQL ของคุณ ถ้าคุณอยู่บน Linux นั่นก็คงจะเป็นsudo service postgresql restartเช่นนั้น

เหล่านี้เป็นคำอธิบายสั้น ๆ ของทั้งสองตัวเลือกตามเอกสาร PostgreSQL อย่างเป็นทางการในวิธีการตรวจสอบ

การรับรองความถูกต้องของเพื่อน

วิธีการรับรองความถูกต้องเพียร์ทำงานโดยการได้รับชื่อผู้ใช้ระบบปฏิบัติการของลูกค้าจากเคอร์เนลและใช้มันเป็นชื่อผู้ใช้ฐานข้อมูลที่ได้รับอนุญาต วิธีการนี้รองรับเฉพาะการเชื่อมต่อท้องถิ่น

การตรวจสอบรหัสผ่าน

วิธีการพิสูจน์ตัวตนแบบใช้รหัสผ่านคือ md5 และรหัสผ่าน วิธีการเหล่านี้ทำงานคล้ายกันยกเว้นวิธีการส่งรหัสผ่านข้ามการเชื่อมต่อคือ MD5-hashed และ clear-text ตามลำดับ

หากคุณกังวลเกี่ยวกับการโจมตีด้วย "ดมกลิ่น" รหัสผ่านแล้ว md5 เป็นที่ต้องการ ควรหลีกเลี่ยงรหัสผ่านธรรมดาหากเป็นไปได้ อย่างไรก็ตาม md5 ไม่สามารถใช้กับคุณสมบัติ db_user_namespace หากการเชื่อมต่อได้รับการป้องกันด้วยการเข้ารหัส SSL สามารถใช้รหัสผ่านได้อย่างปลอดภัย (แม้ว่าการตรวจสอบความถูกต้องใบรับรอง SSL อาจเป็นตัวเลือกที่ดีกว่าหากการเชื่อมต่อนั้นขึ้นอยู่กับการใช้ SSL)

ตำแหน่งตัวอย่างสำหรับpg_hba.conf:
/etc/postgresql/9.1/main/pg_hba.conf


50
คุณจะต้องโหลดบริการ postgresql อีกครั้งหลังจากเปลี่ยนสิ่งนี้/etc/init.d/postgresql reload
funkotron

78
วางที่นี่เพราะฉันมักจะลืมว่าไฟล์นี้อยู่ที่ไหน/etc/postgresql/9.1/main/pg_hba.conf
Doug

12
@funkotron อย่างน้อยในการติดตั้ง ElementaryOS (Ubuntu) ของฉันsudo service postgreql restartก็ใช้งานได้เช่นกัน
Marnen Laibow-Koser

13
ในการตอบคำถามของฉันเอง: 'การรับรองความถูกต้อง' เพียร์ 'หมายความว่า postgres ถามระบบปฏิบัติการสำหรับชื่อเข้าสู่ระบบของคุณและใช้สิ่งนี้สำหรับการรับรองความถูกต้องดังนั้นผู้ใช้ในระบบปฏิบัติการและใน Postgres จะต้องเหมือนกัน 'md5' ใช้การตรวจสอบรหัสผ่านที่เข้ารหัส
เดนนิส

9
ฉันเข้าใจการเปลี่ยนแปลง แต่ทำไมนี่ไม่ใช่พฤติกรรมเริ่มต้น มีข้อเสียเปรียบในการใช้ md5 หรือไม่?
Victor Marconi

361

หลังจากติดตั้ง Postgresql ฉันทำตามขั้นตอนด้านล่าง

  1. เปิดไฟล์pg_hba.confสำหรับ Ubuntu มันจะอยู่ใน/etc/postgresql/9.x/mainและเปลี่ยนบรรทัดนี้:

    ท้องถิ่นทั้งหมด Postgres เพียร์

    ถึง

    ท้องถิ่นเชื่อถือ postgres ทั้งหมด
  2. รีสตาร์ทเซิร์ฟเวอร์

    $ sudo service postgresql restart
  3. เข้าสู่ระบบ psql และตั้งรหัสผ่านของคุณ

    $ psql -U postgres
    db> ALTER USER postgres with password 'your-pass';
  4. ในที่สุดก็เปลี่ยนpg_hba.confจาก

    ท้องถิ่นเชื่อถือ postgres ทั้งหมด

    ถึง

    ท้องถิ่นทั้งหมด postgres md5

หลังจากรีสตาร์ทเซิร์ฟเวอร์ postgresql คุณสามารถเข้าถึงได้ด้วยรหัสผ่านของคุณเอง

รายละเอียดวิธีการรับรองความถูกต้อง:

trust - ใครก็ตามที่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้รับอนุญาตให้เข้าถึงฐานข้อมูล

เพียร์ - ใช้ชื่อผู้ใช้ระบบปฏิบัติการของลูกค้าเป็นชื่อผู้ใช้ฐานข้อมูลเพื่อเข้าถึง

md5 - การพิสูจน์ตัวตนด้วยรหัสผ่าน

สำหรับการอ้างอิงเพิ่มเติมตรวจสอบที่นี่


17
การเปลี่ยนวิธีการเป็น "ความเชื่อถือ" ใช้งานได้สำหรับฉัน +1 สำหรับคำอธิบายวิธีการตรวจสอบรายละเอียด
La-comadreja

4
ใน Homebrew OS X ค่าเริ่มต้นคือความไว้วางใจในขณะที่ Ubuntu ตั้งค่าเริ่มต้นเป็น "เพื่อน" ซึ่งนำไปสู่ความแตกต่างระหว่างการตั้งค่าของฉันและเพื่อนร่วมงานของฉัน เราเปลี่ยนเขาเป็น MD5 ซึ่งไม่ได้ช่วยดังนั้น "ความเชื่อถือ" คือคำตอบที่แท้จริงที่นี่ (เราทำการทดสอบการพัฒนาเท่านั้น) ควรรับ upvotes มากขึ้น
xji

2
คุณยังสามารถตั้งค่า md5 ได้ทุกที่ตั้งแต่เริ่มต้น
Artem.Borysov

2
วิธีนี้ใช้ได้กับฉันโดยใช้วิธี md5 ก่อนไม่ใช่
sianipard

จำเป็นต้องใช้รหัสผ่านเดียวกันหรือไม่ sudo passwd postgres
Peter Krauss

211

หากคุณเชื่อมต่อผ่าน localhost (127.0.0.1) คุณไม่ควรประสบปัญหาดังกล่าว ฉันจะไม่โคลนมากกับ pg_hba.conf แต่ฉันจะปรับเปลี่ยนสตริงการเชื่อมต่อของคุณ:

psql -U someuser -h 127.0.0.1 database

โดยที่ someuser คือผู้ใช้ที่คุณกำลังเชื่อมต่อและฐานข้อมูลเป็นฐานข้อมูลที่ผู้ใช้ของคุณมีสิทธิ์เชื่อมต่อ

นี่คือสิ่งที่ฉันทำบน Debian เพื่อตั้งค่า postgres:

http://www.postgresql.org/download/linux/debian/  (Wheezy 7.x)

as root 

    root@www0:~# echo "deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main" >> /etc/apt/sources.list

    root@www0:~# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -

    root@www0:~# apt-get update

    root@www0:~# apt-get install postgresql-9.4        

    root@www0:~# su - postgres 

    postgres@www0:~$ createuser --interactive -P someuser
    Enter password for new role:
    Enter it again:
    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) n

    postgres@www0:~$ createdb -O someuser database

    postgres@www0:~$ psql -U someuser -h 127.0.0.1 database

สนุก!


16
ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการแก้ปัญหาท้องถิ่นโดยไม่ต้องยุ่งโดยไม่ต้องยุ่งกับการกำหนดค่าทั่วโลกตามคำแนะนำอื่น ๆ
jeteon

1
ฉันต้องเปลี่ยนhost: 127.0.0.1จาก defaulting เป็น localhost ใน config / database.yml - มันอยู่ในเครื่องเดียวกันดังนั้นฉันจึงไม่เข้าใจว่าทำไม
Anthony

แอนโทนี่คุณกำลังบอกว่าคุณประสบปัญหาการเชื่อมต่อล้มเหลวจนกว่าคุณจะปรับ localhost เป็น 127.0.0.1 ใน database.yml ของคุณ? ฉันขอแนะนำให้ตรวจสอบไฟล์ / etc / hosts ของคุณหากเป็นกรณีนี้ มิฉะนั้นอาจมีความผิดปกติอื่น ๆ ที่เกี่ยวข้องกับการแก้ไข localhost
StylusEater

1
นี่เป็นสิ่งที่สวยงามกว่าเมื่อเปรียบเทียบกับวิธีการตรวจสอบความถูกต้องแบบเพียร์
mdh

1
นี่เป็นทางออกที่ดีที่สุดสำหรับ IMO
Salil Junior

45

สิ่งนี้ได้ผลสำหรับฉัน !!

sudo -u postgres psql

สิ่งนี้จะทำงานได้ดีตราบใดที่ผู้ใช้ที่คุณลงชื่อเข้าใช้อยู่ในไฟล์ sudoers
Abubacker Siddik

16

pg_hba.confถ้าคุณมีปัญหาคุณต้องค้นหาของคุณ คำสั่งคือ:

find / -name 'pg_hba.conf' 2>/dev/null

และหลังจากนั้นเปลี่ยนไฟล์กำหนดค่า:

Postgresql 9.3

Postgresql 9.3

Postgresql 9.4

Postgresql 9.3

ขั้นตอนต่อไปคือ: การรีสตาร์ทอินสแตนซ์ db ของคุณ:

service postgresql-9.3 restart

หากคุณมีปัญหาใด ๆ คุณต้องตั้งรหัสผ่านอีกครั้ง:

ALTER USER db_user with password 'db_password';


16
  1. ไปที่ไฟล์/etc/postgresql/9.x/main/นี้แล้วเปิดไฟล์pg_hba.conf

ในกรณีของฉัน:

$>  sudo nano /etc/postgresql/9.3/main/pg_hba.conf
  1. แทนที่เพียร์ด้วยmd5

ดังนั้นสิ่งนี้จะเปลี่ยนเป็น:

การเข้าสู่ระบบการบริหารฐานข้อมูลโดย Unix โดเมนซ็อกเก็ตท้องถิ่นทั้งหมด postgres peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

นี้:

การเข้าสู่ระบบการบริหารฐานข้อมูลโดย Unix โดเมนซ็อกเก็ตท้องถิ่นทั้งหมด postgres md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
  1. จากนั้นรีสตาร์ทเซิร์ฟเวอร์ pg:

    $> sudo service postgresql ทำการรีสตาร์ท

ด้านล่างนี้เป็นรายการวิธีการที่ใช้เชื่อมต่อกับ postgres:

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

หมายเหตุ:หากคุณยังไม่ได้สร้างคุณโพสต์ผู้ใช้ สร้างและขณะนี้คุณสามารถเข้าถึงเซิร์ฟเวอร์ postgres โดยใช้ข้อมูลรับรองผู้ใช้นั้น

เคล็ดลับ:หากไม่สามารถใช้งานได้หลังจากรีสตาร์ท postgres ให้ปิดเทอร์มินัลแล้วเปิดอีกครั้ง


15
sudo psql --host=localhost --dbname=database-name --username=postgres

นี่เป็นการแก้ไขปัญหาของฉัน


3
ฉันไม่คิดว่ามันจะง่ายขนาดนั้น แต่สิ่งนี้ใช้ได้กับฉันภายใต้เดเบียน 9
Hayden Thring

สิ่งนี้ทำงานบน Ubuntu 19.10
Vithal Reddy

ขอขอบคุณมันทำงานบน Ubuntu 19.10 และ psql 12.3
Happy Singh

10

ผมมีปัญหาเดียวกัน.

ทางออกจาก Depa นั้นถูกต้องอย่างแน่นอน

ตรวจสอบให้แน่ใจว่าคุณมีผู้ใช้ที่กำหนดค่าให้ใช้ PostgreSQL

ตรวจสอบไฟล์:

$ ls /etc/postgresql/9.1/main/pg_hba.conf -l

ควรอนุญาตให้ใช้ไฟล์นี้กับผู้ใช้ที่คุณลงทะเบียน psql ด้วย

ต่อไป หากคุณดีจนถึงตอนนี้ ..

อัปเดตตามคำแนะนำของ @ depa

กล่าวคือ

$ sudo nano /etc/postgresql/9.1/main/pg_hba.conf

แล้วทำการเปลี่ยนแปลง


ฉันกำลังเผชิญกับปัญหาเดียวกัน แต่ฉันต้องมีการอนุญาตอะไรบ้างที่ฉันไม่รู้ คุณสามารถช่วยฉันได้ไหม. ฉันได้รับเอาต์พุตสำหรับคำสั่ง 'ls' คือ-rw-r----- 1 postgres postgres 4640 Jun 16 09:59 /etc/postgresql/9.5/main/pg_hba.conf
Sun

8

หากคุณต้องการคงการกำหนดค่าเริ่มต้นไว้ แต่ต้องการการรับรองความถูกต้อง md5 ด้วยการเชื่อมต่อซ็อกเก็ตสำหรับการเชื่อมต่อผู้ใช้ / ฐานข้อมูลหนึ่งให้เพิ่มบรรทัด "local" ก่อนที่จะถึงบรรทัด "local all / all":

# TYPE  DATABASE     USER         ADDRESS             METHOD

# "local" is for Unix domain socket connections only
local   username     dbname                           md5  # <-- this line
local   all          all                              peer
# IPv4 local connections:
host    all          all          127.0.0.1/32        ident
# IPv6 local connections:
host    all          all          ::1/128             ident

คำว่า "ก่อน" ในคำตอบนี้สมควรได้รับรายละเอียดเพิ่มเติมในคำตอบอื่น ๆ ปรากฎว่า psql ตรวจสอบระเบียนในไฟล์ pg_hba.conf ตามลำดับที่ระบุในเอกสาร: postgresql.org/docs/11/static/auth-pg-hba-conf.html
eaydin

# ประเภทฐานข้อมูลผู้ใช้ที่อยู่วิธีใช้ชื่อผู้ใช้ท้องถิ่น dbname md5 # <- บรรทัดนี้ไม่อยู่ในลำดับ
Kiry Meas

7

ฉันย้ายไดเรกทอรีข้อมูลบนเซิร์ฟเวอร์โคลนและมีปัญหาในการเข้าสู่ระบบเป็น postgres การรีเซ็ตรหัสผ่าน postgres เช่นนี้ใช้ได้สำหรับฉัน

root# su postgres
postgres$ psql -U postgres
psql (9.3.6) 
Type "help" for help. 
postgres=#\password 
Enter new password: 
Enter it again: 
postgres=#

6

การแก้ไขด้านบนใช้งานได้สำหรับฉันหลังจากที่ฉันพบว่าฉันต้องรีสตาร์ทเซิร์ฟเวอร์ postgres หลังจากสร้างเสร็จ สำหรับ Ubuntu:

sudo /etc/init.d/postgresql restart

6

การเปลี่ยนวิธีใช้เพียร์เป็นวางใจใน pg_hba.conf (/etc/postgresql/9.1/main/pg_hba.conf | บรรทัดที่ 85) แก้ปัญหาได้ เพิ่ม md5 ขอรหัสผ่านเพราะฉะนั้นถ้ามีความต้องการที่จะหลีกเลี่ยงการใช้รหัสผ่านที่ใช้ความไว้วางใจแทนmd5



5

คำสั่งด้านล่างใช้งานได้สำหรับฉัน:

psql -d myDb -U username -W

man psql-W --password Force psql to prompt for a password before connecting to a database. This option is never essential, since psql will automatically prompt for a password if the server demands password authentication. However, psql will waste a connection attempt finding out that the server wants a password. In some cases it is worth typing -W to avoid the extra connection attempt.
Yaroslav Nikitenko

3

คุณต้องตั้งค่าวิธีการเชื่อถือ

#TYPE  DATABASE        USER            ADDRESS                 METHOD
local    all             all                                     trust

และโหลดเซิร์ฟเวอร์ postgres อีกครั้ง

# service postgresql-9.5 reload

การเปลี่ยนแปลงใน pg_hba.conf ไม่จำเป็นต้องใช้เซิร์ฟเวอร์ RESTART postgres เพียงแค่โหลด


3

คำตอบอื่น ๆ อีกมากมายเกี่ยวข้องกับการตั้งค่าในไฟล์ปรับแต่งต่างๆและคำตอบที่เกี่ยวข้องกับสิ่งที่pg_hba.confต้องปฏิบัติและถูกต้อง 100% อย่างไรก็ตามตรวจสอบให้แน่ใจว่าคุณกำลังแก้ไขไฟล์กำหนดค่าที่ถูกต้องปรับเปลี่ยนการตั้งค่าที่ถูกต้องไฟล์

ดังที่คนอื่น ๆ ได้กล่าวถึงตำแหน่งของไฟล์กำหนดค่าสามารถถูกแทนที่ด้วยการตั้งค่าต่างๆภายในไฟล์กำหนดค่าหลักรวมถึงการระบุพา ธ ไปยังไฟล์กำหนดค่าหลักในบรรทัดคำสั่งพร้อม-Dตัวเลือก

คุณสามารถใช้คำสั่งต่อไปนี้ในขณะที่อยู่ในเซสชัน psql เพื่อแสดงตำแหน่งที่ไฟล์การอ่านของคุณอยู่ (สมมติว่าคุณสามารถเรียกใช้ psql) นี่เป็นเพียงขั้นตอนการแก้ไขปัญหาที่สามารถช่วยบางคน:

select * from pg_settings where setting~'pgsql';  

คุณควรตรวจสอบให้แน่ใจว่าไดเรกทอรีบ้านสำหรับผู้ใช้ postgres ของคุณอยู่ในตำแหน่งที่คุณคาดหวัง ฉันพูดแบบนี้เพราะมันค่อนข้างง่ายที่จะมองข้ามสิ่งนี้เนื่องจากความจริงที่ว่าพรอมต์ของคุณจะแสดง ' ~' แทนเส้นทางที่แท้จริงของไดเรกทอรีบ้านของคุณทำให้ไม่ชัดเจน การติดตั้งจำนวนมากเป็นค่าเริ่มต้นไดเรกทอรีบ้านของผู้ใช้ postgres/var/lib/pgsqlไป

หากไม่ได้ตั้งค่าตามที่ควรจะเป็นให้หยุดบริการ postgresql และใช้คำสั่งต่อไปนี้ขณะที่ล็อกอินเป็น root ตรวจสอบให้แน่ใจด้วยว่าผู้ใช้ postgres ไม่ได้ลงชื่อเข้าใช้ในเซสชันอื่น:

usermod -d /path/pgsql postgres

สุดท้ายตรวจสอบให้แน่ใจว่าตัวแปร PGDATA ของคุณตั้งค่าไว้อย่างถูกต้องโดยการพิมพ์echo $PGDATAซึ่งควรแสดงผลลัพธ์ที่คล้ายกับ:

/path/pgsql/data

หากไม่ได้ตั้งค่าไว้หรือแสดงสิ่งที่แตกต่างจากที่คุณคาดไว้ให้ตรวจสอบการเริ่มต้นหรือไฟล์ RC ของคุณเช่น. profile หรือ. bash.rc - สิ่งนี้จะแตกต่างกันไปขึ้นอยู่กับระบบปฏิบัติการและเชลล์ของคุณ เมื่อคุณได้กำหนดสคริปต์เริ่มต้นที่ถูกต้องสำหรับเครื่องของคุณคุณสามารถแทรกต่อไปนี้:

export PGDATA=/path/pgsql/data

สำหรับระบบของฉันฉันวาง/etc/profile.d/profile.local.shมันไว้เพื่อให้ผู้ใช้ทุกคนสามารถเข้าถึงได้

ตอนนี้คุณควรจะสามารถเริ่มฐานข้อมูลได้ตามปกติและการตั้งค่าเส้นทาง psql ทั้งหมดของคุณควรถูกต้อง!


3

pg_config ใช้สำหรับข้อมูลการคอมไพล์เพื่อช่วยให้ส่วนขยายและโปรแกรมไคลเอนต์รวบรวมและเชื่อมโยงกับ PostgreSQL มันไม่รู้อะไรเลยเกี่ยวกับอินสแตนซ์ PostgreSQL ที่ใช้งานอยู่บนเครื่องเพียงไบนารี

pg_hba.conf สามารถปรากฏในหลาย ๆ ที่ได้ทั้งนี้ขึ้นอยู่กับวิธีการติดตั้ง Pg ตำแหน่งมาตรฐานคือ pg_hba.conf ภายใน data_directory ของฐานข้อมูล (ซึ่งอาจอยู่ใน / home, / var / lib / pgsql, / var / lib / postgresql / [version] /, / opt / postgres / ฯลฯ ฯลฯ ) แต่ผู้ใช้และผู้ทำแพ็กเกจสามารถนำไปใช้ได้ทุกที่ น่าเสียดาย.

วิธีที่ถูกต้องในการค้นหา pg_hba.conf ก็คือการถามอินสแตนซ์ของ PostgreSQL ที่กำลังทำงานอยู่ที่ pg_hba.conf นั้นอยู่หรือถาม sysadmin ว่ามันอยู่ที่ไหน คุณไม่สามารถพึ่งพาการถามว่า datadir อยู่ที่ใดและแยกวิเคราะห์ postgresql.conf เนื่องจากสคริปต์ init อาจส่งผ่านพารามิเตอร์เช่น -c hba_file = / some / other / path เมื่อเริ่มต้น Pg

สิ่งที่คุณต้องการทำคือถาม PostgreSQL:

SHOW hba_file;

คำสั่งนี้จะต้องทำงานในเซสชัน superuser ดังนั้นสำหรับเชลล์สคริปต์คุณอาจเขียนสิ่งที่ชอบ:

psql -t -P format=unaligned -c 'show hba_file';

และตั้งค่าตัวแปรสภาพแวดล้อม PGUSER, PGDATABASE และอื่น ๆ เพื่อให้แน่ใจว่าการเชื่อมต่อนั้นถูกต้อง

ใช่นี่เป็นปัญหาของไก่และไข่ในกรณีที่ผู้ใช้ไม่สามารถเชื่อมต่อ (พูดหลังจากแก้ไขการ pg_hba.conf แล้ว) คุณไม่สามารถค้นหา pg_hba.conf เพื่อแก้ไขได้

อีกทางเลือกหนึ่งคือดูที่ผลลัพธ์ของคำสั่ง ps และดูว่าอาร์กิวเมนต์ไดเรกทอรีข้อมูลผู้ดูแลข้อมูล -D สามารถมองเห็นได้หรือไม่เช่น

ps aux  | grep 'postgres *-D'

เนื่องจาก pg_hba.conf จะอยู่ในไดเรกทอรีข้อมูล (เว้นแต่ว่าคุณใช้ Debian / Ubuntu หรือใช้อนุพันธ์และใช้แพ็คเกจ)

หากคุณกำหนดเป้าหมายเฉพาะระบบ Ubuntu ที่ติดตั้ง PostgreSQL จากแพ็คเกจ Debian / Ubuntu มันจะง่ายขึ้นเล็กน้อย คุณไม่ต้องจัดการกับ Pg ที่คอมไพล์จากแหล่งข้อมูลว่ามีใครบางคนเป็นแหล่งข้อมูลสำหรับใช้ในบ้านหรือการติดตั้ง EnterpriseDB Pg ใน / opt ฯลฯ คุณสามารถถาม pg_wrapper, Debian / Ubuntu หลายแห่ง -version Pg manager โดยที่ PostgreSQL กำลังใช้คำสั่ง pg_lsclusters จาก pg_wrapper

หากคุณไม่สามารถเชื่อมต่อได้ (Pg ไม่ทำงานหรือคุณต้องแก้ไข pg_hba.conf เพื่อเชื่อมต่อ) คุณจะต้องค้นหาระบบสำหรับไฟล์ pg_hba.conf สำหรับ Mac และ Linux บางอย่างเช่น sudo find / -type f -name pg_hba.conf จะทำเช่นนั้น จากนั้นตรวจสอบไฟล์ PG_VERSION ในไดเรกทอรีเดียวกันเพื่อให้แน่ใจว่าเป็นรุ่น PostgreSQL ที่ถูกต้องหากคุณมีมากกว่าหนึ่ง (หาก pg_hba.conf อยู่ใน / etc / ให้ข้ามสิ่งนี้เป็นชื่อไดเรกทอรีหลักแทน) หากคุณมีไดเรกทอรีข้อมูลมากกว่าหนึ่งรายการสำหรับรุ่น PostgreSQL เดียวกันคุณจะต้องดูขนาดฐานข้อมูลตรวจสอบบรรทัดคำสั่งของ postgres ที่รันอยู่จาก ps เพื่อดูว่าเป็นไดเรกทอรีข้อมูล -D อาร์กิวเมนต์ที่ตรงกับที่คุณแก้ไขหรือไม่ ฯลฯ . /ubuntu/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711


2

ปัญหาของฉันคือฉันไม่ได้พิมพ์เซิร์ฟเวอร์ใด ๆ ฉันคิดว่ามันเป็นค่าเริ่มต้นเพราะตัวแทน แต่เมื่อฉันพิมพ์ localhost มันทำงานได้


2

หากคุณพยายามค้นหาไฟล์นี้ใน Cloud 9 คุณสามารถทำได้

sudo vim /var/lib/pgsql9/data/pg_hba.conf

กดIเพื่อแก้ไข / แทรกกดESC3 ครั้งและประเภท:wqจะบันทึกไฟล์และออกจาก


2

หากคุณกำลังประสบปัญหานี้กับทางรถไฟและคุณรู้ว่าคุณได้สร้างชื่อผู้ใช้ด้วยรหัสผ่านพร้อมด้วยสิทธิ์ที่ถูกต้องคุณต้องใส่ต่อไปที่ท้ายไฟล์ database.yml ของคุณ

host: localhost

ไฟล์โดยรวมจะมีลักษณะดังนี้

development:
  adapter: postgresql
  encoding: unicode
  database: myapp_development
  pool: 5
  username: root
  password: admin
  host: localhost

คุณไม่จำเป็นต้องแตะpg_hba.confไฟล์เลย การเข้ารหัสที่มีความสุข


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.