psql: FATAL: Не вдалося здійснити аутентифікацію одноранців для користувача "dev"


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"

Я намагався вирішити проблему, але не вдався.


2
не вдалося зробити копію аутентифікації PG Peer
Daniel Vérité

тепер, щоб запропонувати відповіді на вищезазначені питання, вам потрібно додати --interactiveдо команди:createuser --interactive joe
user3791372

Відповіді:


310

Спробуйте:

psql -U user_name  -h 127.0.0.1 -d db_name

де

  • -U - це ім'я користувача бази даних
  • -h є ім'ям хоста / IP локального сервера, таким чином уникаючи сокетів домену Unix
  • -d це ім'я бази даних, до якої потрібно підключитися

Потім це оцінюється як "мережеве" з'єднання за допомогою Postgresql, а не з'єднання сокета домену Unix, таким чином, не оцінюється як "локальне" з'єднання, як ви могли бачити в pg_hba.conf:

local   all             all                                     peer

15
Мені потрібно (ver 9.4): psql -U user-name -h 127.0.0.1 -d db-name
Грегор

9
який декоративний інструмент. Посібник говорить psql [option...] [dbname [username]], так що ви можете подумати, що psql dbname usernameце просто спрацює ..
djeikyb

2
Працював і для мене. Я також думаю, що це набагато кращий спосіб, ніж зміна конфігураційних файлів, особливо коли у вас немає поняття про те, що ви робите, і лише слідуючи відповіді ТА, щоб вирішити свою проблему.
borisano

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підключається через сокети UNIX за допомогою peerаутентифікації, що вимагає від поточного користувача UNIX того ж імені користувача, що і psql. Тож вам доведеться створити користувача UNIX, devа потім увійти як devабо використовувати sudo -u dev psql test_developmentдля доступу до бази даних (і неpsql слід запитувати пароль).

Якщо ви не можете або не хочете створити користувача UNIX, наприклад, якщо ви просто хочете підключитися до вашої бази даних для спеціальних запитів, форсування з'єднання з використанням сокета psql --host=localhost --dbname=test_development --username=dev(на що вказує відповідь @meyerson) вирішить вашу негайну проблему.

Але якщо ви маєте намір застосувати автентифікацію пароля через сокети Unix замість методу peer, спробуйте змінити наступний 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_Які коментарі включені у відповідь.


5
Як ви дозволяєте peer ТА md5 ? Коли я встановив md5, я більше не можу ввійти з postgresкористувачем! Я спробував додати кілька рядків і розділити метод комами, але вони не спрацювали. Гаразд, я знайшов mgoldwasserвідповідь, і це спрацювало. Я тільки що додав ще один рядок для користувача postgresз методом peer!
Хлоя

3
Не хвилюйтеся, ви можете встановити аутентифікацію однорангових певних користувачів (наприклад, ваше ім’я користувача або постгреси). Здається, конкретні правила перекривають загальні правила
JavierIEH

1
З деякими дистрибутивами файл також можна знайти тут:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
ви не можете зробити це без перезавантаження postgresql? Ви не можете просто вказати метод аутентифікації в таблиці pg_user?
fccoelho

2
Ви можете перезавантажити замість перезавантаження. Це перезавантажує таблицю pg_hba. Працювали для мене.
Джоаніс

29

Peer аутентифікація означає, що postgres запитує операційну систему для вашого імені для входу та використовує це для аутентифікації. Щоб увійти як "dev" користувача, використовуючи аутентифікацію одноранців на postgres, ви також повинні бути користувачем "dev" в операційній системі.

Детальну інформацію про методи аутентифікації можна знайти в документації Postgresql .

Підказка: Якщо жоден метод аутентифікації більше не працює, відключіть сервер від мережі та використовуйте метод "довіра" для "localhost" (і двічі перевірте, чи ваш сервер недоступний через мережу, поки метод "довіра" включений).


1
дякую за ваші відповіді. Але все одно не працює, якщо я devXXX
перейду на

2
Відповідь стефана правильна. Щойно я додав посилання, яке буде видно при перегляді моєї редакції, до документації, де пояснюється кожен із способів аутентифікації.
dsh

25

Коли ви вкажете:

psql -U user

він підключається через UNIX Socket, який за замовчуванням використовує peerавтентифікацію, якщо не вказано pg_hba.confінше.

Ви можете вказати:

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

щоб отримати TCP / IP-з'єднання в інтерфейсі зворотного зв'язку (і IPv4, і IPv6) для вказаних databaseі user.

Після змін вам доведеться перезапустити postgres або перезавантажити його конфігурацію. Перезапустіть, що має працювати в сучасних дистрибутивах на базі RHEL / Debian:

service postgresql restart

Перезавантаження має працювати наступним чином:

pg_ctl reload

але команда може відрізнятися залежно від конфігурації PATH - можливо, вам доведеться вказати абсолютний шлях, який може бути різним, залежно від способу встановлення постгресів.

Тоді ви можете використовувати:

psql -h localhost -U user -d database

увійти в систему з userвказаним databaseчерез TCP / IP. md5розшифровується як зашифрований пароль, тоді як 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


У моїй проблемі було використання postgres на Raspberry. ^^^ працював на мене !! Дякую!
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.

Я додав його до PATH у моєму файлі .bashrc і додав цей рядок наприкінці

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

потім у командному рядку

$> source ./.bashrc

Я освіжив своє баш-середовище. Тепер я можу використовувати postgres -D /whereverз будь-якого каталогу


1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb


На яке запитання відповідає ця відповідь? Чому це може -U postgresбути ключовим? Що це взагалі за тире-листи ?
сіра борода

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.