Ответ 1
Вопросы о логине без пароля продолжают появляться. Продолжайте читать, лучшие варианты приходят последними. Но сначала проясните пару вещей.
Заблокировать запрос пароля
Если ваша проблема - это только пароль, вы можете ее отключить. Я цитирую руководство здесь:
-w
--no-password
Никогда не выдавайте запрос пароля. Если серверу требуется аутентификация по паролю и пароль недоступен другими способами, такими как a
.pgpass
, попытка подключения завершится неудачно. Этот параметр может быть полезно в пакетных заданиях и сценариях, где пользователь не вводит пароль. (...)
Вам, вероятно, не нужен пароль
Обычно это не нужно. Суперпользователь базы данных по умолчанию postgres
обычно соответствует системному пользователю с тем же именем. Выполнение psql
из этой учетной записи не требует пароля, если метод аутентификации peer
или ident
устанавливаются в файле pg_hba.conf
. У вас, вероятно, есть такая строка:
local all postgres peer
И обычно также:
local all all peer
Это означает, что каждый локальный пользователь может войти во всю базу данных как пользователь базы данных с тем же именем без пароля.
Однако, здесь есть общее заблуждение. Цитата снова:
Этот метод поддерживается только в локальных соединениях.
Смелый акцент мой.
Вы подключаетесь к localhost
, который не является локальным подключением, хотя в нем есть слово "local". Это соединение TCP/IP с 127.0.0.1. Википедия на localhost:
В современных компьютерных системах
localhost
как имя хоста переводит IPv4 в сетевом блоке127.0.0.0/8
(loopback), обычно127.0.0.1
или::1
в IPv6.
Простое решение для локальных соединений
Опустите параметр -h
из вызова psql
. Выделите руководство по psql
еще раз:
Если вы опустите имя хоста, psql подключит через сокет Unix-доменана сервер на локальном хосте или через TCP/IP на
localhost
на машинах которые не имеют сокетов Unix-домена.
Окна
... не имеет сокетов Unix-домена, строки pg_hba.conf
, начинающиеся с local
, не применимы к Windows. В Windows вы подключаетесь через localhost
по умолчанию, что возвращает нас к началу.
Если ваши требования безопасности слабы, вы можете просто доверять всем соединениям через localhost
:
host all all 127.0.0.1/32 trust
Я бы сделал это только для отладки с удаленными подключениями. Для большей безопасности вы можете использовать SSPI authentication в Windows. Добавьте эту строку в pg_hba.conf
для локальных соединений:
host all all 127.0.0.1/32 sspi
Если вам действительно нужен пароль
Вы можете установить переменную среды , но она обескуражена, особенно для Windows. Руководство:
PGPASSWORD
ведет себя так же, как соединение passwordпараметр. Использование этой переменной среды не рекомендуется по соображениям безопасности, поскольку некоторые операционные системы допускают использование не root пользователям просматривать переменные среды процесса через ps; вместо рассмотрите возможность использования файла~/.pgpass
(см. Раздел 32.15).
A conninfo
строка является альтернативой для указания параметров подключения:
$ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"
Или URI, который используется вместо имени базы данных:
$ psql postgresql://myuser:[email protected]:5432/mydb?sslmode=require
Файл паролей
Но обычно предпочтительнее настраивать .pgpass
файл вместо того, чтобы помещать пароли в файлы script.
Внимательно прочитайте короткую главу в руководстве. В частности, обратите внимание, что здесь...
Имя хоста
localhost
соответствует как TCP (имя хостаlocalhost
), так и сокет домена Unix (pghost
пустой или каталог сокета по умолчанию), идущие с локальной машины.
Точный путь зависит от системы. Этот файл может содержать пароли для нескольких комбинаций роли и порта (кластер БД):
localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...
В Windows машины ищут файл в:
C:\Documents and Settings\My_Windows_User_Name\Application Data\postgresql
C:\Documents and Settings\My_Windows_User_Name\Application Data\postgresql