Запустить командный файл с командой psql без пароля

Я пытаюсь выполнить эту команду psql с помощью пакета script:

psql --host=localhost --dbname=<dbname> --port=<Port Number>
     --username=<dbuser> --file=C:\PSQL_Script.txt --output=C:\PSQL_Output.txt

Проблема в том, что он запрашивает пароль каждый раз, когда я выполняю пакет script. Как аргумент пароля через пакетный файл?

Ответ 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).

Руководство по psql:

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

Ответ 2

У меня была одна и та же проблема:

psql -hlocalhost -d<myDB> -U<myUser>

всегда запрашивал пароль. Это объясняется @Erwin, поскольку -hlocalhost подключается через TCP, а не через сокет Unix-домена (для ОС на базе Unix). Поэтому, даже если вы настроили свой local как надежный:

local   all    all                     trust

он все равно запросит пароль. Поэтому, чтобы настроить -hlocalhost на работу через TCP, мне пришлось настроить адреса host для локальных адресов так:

host    all    all    127.0.0.1/32     trust
host    all    all    ::1/128          trust

Но это не сработало для меня. Мне нужно было объединить оба этих параметра:

host    all    all    localhost        trust

Некоторые дополнительные показания: