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

Я пытаюсь выполнить это psql Команда с использованием пакетного скрипта:

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

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

4 ответа

Продолжайте читать, лучшие варианты приходят последними. Но давайте сначала уточним пару вещей.

Только замолчать запрос пароля

Если ваша проблема заключается только в запросе пароля, вы можете отключить его. Я цитирую руководство здесь:

-w
--no-password

Никогда не вводите запрос пароля. Если сервер требует аутентификации по паролю, а пароль недоступен другими способами, такими как .pgpass файл, попытка подключения не удастся. Эта опция может быть полезна в пакетных заданиях и сценариях, где нет ни одного пользователя для ввода пароля. (...)

Вам, вероятно, не нужен пароль

Обычно это не нужно. Суперпользователь базы данных по умолчанию postgres обычно соответствует системному пользователю с таким же именем. Бег psql с этого аккаунта не требуется пароль, если метод аутентификации peer или же ident установлены в вашем pg_hba.conf файл. У вас, вероятно, есть такая строка:

local    all    postgres    peer

И обычно также:

local    all    all         peer

Это означает, что каждый локальный пользователь может войти во всю базу данных как пользователь базы данных с тем же именем без пароля.
Однако, здесь есть распространенное заблуждение. Цитирую еще раз:

Этот метод поддерживается только на локальных соединениях.

Жирный акцент мой.
Вы подключаетесь к localhost, который не является "локальной связью", хотя в нем есть слово "местная". Это соединение TCP/IP с 127.0.0.1. Википедия на локальном хосте:

На современных компьютерных системах, localhost как имя хоста преобразуется в адрес IPv4 в 127.0.0.0/8 (петлевой) сетевой блок, обычно 127.0.0.1, или же ::1 в IPv6.

Простое решение для локальных подключений

Пропустить параметр -h от psql призывание. Цитирование руководства по psql еще раз:

Если вы опустите имя хоста, psql подключится через сокет Unix-домена к серверу на локальном хосте или через TCP/IP для localhost на машинах, которые не имеют сокетов Unix-домена.

Windows

... не имеет сокетов Unix-домена, pg_hba.conf строки, начинающиеся с local не применимы в Windows. В Windows вы подключаетесь через localhost по умолчанию, что возвращает нас к началу.

Если ваши требования безопасности слабы, вы можете просто доверять всем соединениям через localhost:

host    all    all    127.0.0.1/32     trust

Я бы сделал это только для отладки с отключенными удаленными подключениями. Для большей безопасности вы можете использовать аутентификацию SSPI в Windows. Добавить эту строку в pg_hba.conf для "локальных" соединений:

host    all    all    127.0.0.1/32     sspi

Если вам действительно нужен пароль

Вы можете установить переменную окружения, но это не рекомендуется, особенно для Windows. Руководство:

PGPASSWORD ведет себя так же, как параметр подключения пароля. Использование этой переменной среды не рекомендуется из соображений безопасности, поскольку некоторые операционные системы позволяют пользователям без полномочий root просматривать переменные среды процесса через ps; вместо этого рассмотрите возможность использования ~/.pgpass файл (см. раздел 32.15).

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

conninfo Строка является альтернативой для указания параметров подключения:

 $ psql "user=myuser password=secret_pw host=localhost port=5432 sslmode=require"

Или URI, который используется вместо имени базы данных:

 $ psql postgresql://myuser:secret_pw@localhost:5432/mydb?sslmode=require

Файл пароля

Но обычно предпочтительнее настроить .pgpass файл, а не помещать пароли в файлы сценариев.
Внимательно прочитайте короткую главу в руководстве. В частности, обратите внимание, что здесь...

Имя хоста localhost соответствует как TCP (имя хоста localhost) и сокет домена Unix (pghost пустой каталог или каталог сокетов по умолчанию) соединения с локальной машины.

Точный путь зависит от системы. Этот файл может хранить пароли для нескольких комбинаций роли и порта (кластер БД):

localhost:5432:*:myadmin:myadminPasswd
localhost:5434:*:myadmin:myadminPasswd
localhost:5437:*:myadmin:myadminPasswd
...

На машинах Windows ищите файл в:

%APPDATA%\postgresql\pgpass.conf

%APPDATA% обычно разрешает: C:\Documents and Settings\My_Windows_User_Name\Application Data\,

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

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

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

Документация postgres - https://www.postgresql.org/docs/9.6/static/app-psql.html

-w --no-password Никогда не выдавать запрос пароля. Если серверу требуется аутентификация по паролю, а пароль недоступен другими способами, такими как файл.pgpass, попытка подключения завершится неудачно. Эта опция может быть полезна в пакетных заданиях и сценариях, где нет ни одного пользователя для ввода пароля.

Я нашел этот способ передачи строки подключения команде, т.е.

      $ psql postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}

`Пример:

      $ psql postgresql://user:password@127.0.0.1:5432/database

Таким образом, если вам нужно передать пароль базы данных, но вы не хотите продолжать передавать его в командной строке, вы можете просто сделать это в своем файле bash.

Другие вопросы по тегам