Запустите пакетный файл с помощью команды 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.