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"

Я пытался решить проблему, но не смог.



Теперь для получения ответов на поставленные выше вопросы необходимо добавить --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
Мне нужно (версия 9.4): psql -U user-name -h 127.0.0.1 -d db-name
— Грегор

9
что за злобный инструмент. в руководстве написано psql [option...] [dbname [username]], что можно подумать, psql dbname usernameчто это сработает ..
— djeikyb

2
У меня тоже сработало. Я также думаю, что это гораздо более предпочтительный способ, чем изменение конфигурационных файлов, особенно если у вас нет понятия о том, что вы делаете, и просто следуйте SO-ответу, чтобы решить вашу проблему.
— Борисано

1
это сработало для меня, большое спасибо, хотя я делаю исследование, почему это было правильное решение. тем не менее, в конфигурации на другой машине я бы вошел как psql -U username -d database. так что я думаю, что принятое решение зависит от случая.
— Лазарь Восход

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 вместо однорангового метода, попробуйте изменить следующую 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
Не волнуйтесь, вы можете установить одноранговую аутентификацию для определенных пользователей (например, ваше имя пользователя или postgres). Кажется, что определенные правила переопределяют общие правила
— JavierIEH

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

2
Вы не можете сделать это без перезапуска postgresql? Вы не можете просто указать метод аутентификации в таблице pg_user?
— fccoelho

2
Вы можете перезагрузить вместо перезагрузки. Это перезагрузит таблицу pg_hba. Работал на меня.
— Джоанис

29

Одноранговая аутентификация означает, что postgres запрашивает у вашей операционной системы ваше имя для входа и использует его для аутентификации. Чтобы войти в систему как пользователь "dev" с использованием одноранговой аутентификации на postgres, вы также должны быть пользователем "dev" в операционной системе.

Вы можете найти подробную информацию о методах аутентификации в документации Postgresql .

Подсказка: если метод аутентификации больше не работает, отключите сервер от сети и используйте метод «trust» для «localhost» (и дважды проверьте, что ваш сервер недоступен через сеть, пока включен метод «trust»).


1
спасибо за ваши ответы. но это все еще не работает, если я изменяю на devсистемного пользователяXXX
— hsming

2
Ответ Стефана правильный. Я просто добавил ссылку, которая будет видна при просмотре моего редактирования, в документации, где объясняется каждый из методов аутентификации.
— дш

25

Когда вы указываете:

psql -U user

он подключается через сокет UNIX, который по умолчанию использует 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 - вам может потребоваться указать абсолютный путь, который может отличаться в зависимости от способа установки postgres.

Тогда вы можете использовать:

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 на малину. ^^^ работал на меня! Спасибо!
— Tidydee

2

В моем случае я использовал другой порт. По умолчанию 5432. Я использовал 5433. Это сработало для меня:

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

Это может произойти автоматически, если у вас есть несколько установок postgres.
— Galigator

1

Для людей, которые в будущем увидят это, postgresэто /usr/lib/postgresql/10/binна моем сервере Ubuntu.

Я добавил его в PATH в моем файле .bashrc и добавил эту строку в конце

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

затем в командной строке

$> source ./.bashrc

Я обновил свою среду Bash. Теперь я могу использовать postgres -D /whereverиз любого каталога



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.