psql не входит в систему, а pgAdmin успешно входит в систему? Неправильная команда?

У меня есть удаленная машина, и я пытаюсь войти в базу данных postgres с помощью следующей команды (запуск от имени пользователя Linux root через ssh, т.е. локально на этой машине):

# psql -d mydatabase -U postgres -W
Password for user postgres: <here goes my password>
psql: FATAL:  Peer authentication failed for user "postgres"

По какой-то причине это не удается (пробовал ~ 5 раз).

Но когда я вхожу в ту же базу данных с помощью pgAdmin (т.е. удаленно) с той же ролью (postgres) и одним и тем же паролем, он каждый раз успешно входит в систему.

Что не так с командой psql, которую я использую? Если это правильно, можете ли вы предложить какие-либо шаги по устранению неполадок?

РЕДАКТИРОВАТЬ: Итак, проблема в том, что в pg_hba.conf удаленные и локальные соединения обрабатываются по-разному. Удаленные настроены правильно. Вопрос в том, почему местные не работают.

Для местных у меня в pg_hba.conf:

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

Правильно ли я понимаю, что для localhost соединений он сначала пытается аутентифицировать одноранговый узел, а если это не удается, он не пытается md5 и просто возвращает ошибку?


person Boris Burkov    schedule 21.09.2015    source источник
comment
PgAdmin будет использовать tcp/ip для локального хоста (127.0.0.1), psql будет использовать сокеты unix. См. pg_hba.conf и главу руководства по аутентификации клиентов.   -  person Craig Ringer    schedule 21.09.2015
comment
Вы можете заставить psql использовать сокет inet, указав имя хоста: psql -U postgres -h 127.0.0.1 mydb   -  person joop    schedule 22.09.2015


Ответы (1)


psql по умолчанию пытается войти через одноранговый узел. Это означает, что вы должны войти в систему как postgres на своем локальном компьютере. Вы можете заставить psql использовать TCP/IP, вам нужно указать хост, который может быть локальным, поэтому вызов может выглядеть так:

psql -U postgres -h 127.0.0.1

Другой способ - изменить настройки. Я вижу два способа изменить ваши текущие локальные настройки:

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

1) Разрешить всем пользователям входить без пароля с локального хоста, установив строку

local   all             all                                     trust

Это очень опасно и не должно быть сделано ИМХО.

2) Другой способ может состоять в том, чтобы создать пользователя базы данных с тем же именем пользователя, что и ваш системный логин, и предоставить все права этой учетной записи.

И, конечно же, именно это я обычно и делаю в таких случаях: запускаю psql в контексте пользователя postgres, например. с помощью sudo -u postgres psql или с su -u postgres -c "psql..."

person frlan    schedule 22.09.2015