Postgresql: выполнение сценариев psql с паролем
Как я могу назвать psql в Так что не запрашивает пароль?
вот что у меня есть:
psql -Umyuser < myscript.sql
однако я не смог найти аргумент, который передает пароль, и поэтому psql всегда запрашивает его.
12 ответов
существует несколько способов аутентификации в PostgreSQL. Возможно, вы захотите изучить альтернативы аутентификации по паролю вhttps://www.postgresql.org/docs/current/static/client-authentication.html.
чтобы ответить на ваш вопрос, есть несколько способов предоставить пароль для аутентификации на основе пароля. Очевидный способ - через подсказку пароля. Вместо этого вы можете указать пароль в файле pgpass или через PGPASSWORD
переменные среды. Смотри:
- https://www.postgresql.org/docs/9.0/static/libpq-pgpass.html
- https://www.postgresql.org/docs/9.0/interactive/libpq-envars.html
нет возможности указать пароль в качестве аргумента командной строки, поскольку эта информация часто доступна всем пользователям и поэтому небезопасна. Однако в средах Linux / Unix вы можете предоставить переменную среды для одной команды, например это:
PGPASSWORD=yourpass psql ...
Если вы собираетесь иметь несколько хостов / подключений к базе данных,~/.файл pgpass - это путь.
действия:
- создать ~/.файл pgpass. Введите информацию в следующем формате имя хоста: порт: база данных: имя пользователя: пароль
- не добавляйте строковые кавычки вокруг значений полей. Вы также можете использовать * в качестве подстановочного знака для полей порта/базы данных.
- создайте псевдоним в своем профиле bash, который запускает ваш psql команда для вас. Например:
alias postygresy='psql --host hostname database_name -U username'
значения должны соответствовать тем, которые вы указали в ~/.файл pgpass. - источник вашего профиля bash.
- введите псевдоним из командной строки.
обратите внимание, что если у вас есть набор переменных export PGPASSWORD=", он будет иметь приоритет над файлом. Также разумно изменить разрешения вашего файла, чтобы содержимое было скрыто от других пользователей. Этого можно достичь с помощью chmod 600 ~/.pgpass
вы должны создать файл пароля: см. http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html для получения дополнительной информации.
Если у вас возникли проблемы с windows, как я (я использую Windows 7 64-бит) и set PGPASSWORD=[Password]
не работает.
тогда, как сказал Kavaklioglu в одном из комментариев,
export PGPASSWORD=[password]
вам нужно будет сохранить это в верхней части файла или перед любым использованием, чтобы его установить перед вызовом.
конечно, работает на windows:)
учитывая проблемы безопасности при использовании переменной среды PGPASSWORD, я думаю, что лучшее общее решение заключается в следующем:
- напишите свой собственный временный файл pgpass с паролем, который вы хотите использовать.
- используйте переменную среды PGPASSFILE, чтобы сообщить psql использовать этот файл.
- удалите временный файл pgpass
здесь есть несколько моментов. Шаг 1, чтобы избежать mucking с ~ / пользователя.pgpass файл, который может существовать. Вы также должны убедиться, что файл имеет разрешения 0600 или меньше.
некоторые предложили использовать bash, чтобы сократить это следующим образом:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
использует
WARNING: password file "/dev/fd/63" is not a plain file
дом на ответ mightybyte для тех, кто не комфортно с * nix Shell scripting, вот рабочий скрипт:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
chmod 600 $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
двойной знак доллара ($$
) в /tmp/pgpasswd$$
в строке 2 добавляется идентификатор процесса к имени файла, так что этот сценарий может быть запущен более одного раза, даже одновременно, без побочных эффектов.
обратите внимание на использование chmod
команда в строке 4-так же, как "не равнина файл" ошибка, что mightybyte описано, есть также "разрешения" ошибка, если это не будет сделано.
в строке 6 вам не придется использовать -h
myserver, the -p
myport или -U
ipetrov вместо флаг, если вы используете по умолчанию (localhost в : 5432) и только один пользователь базы данных. Для нескольких пользователей (но соединение по умолчанию) измените эту строку к
psql mydb jdoe
не забудьте сделать скрипт исполняемый файл С
chmod +x runpsql
(или как вы называете файл сценария)
Это можно сделать просто с помощью PGPASSWORD. Я использую psql 9.5.10. В вашем случае решение будет
PGPASSWORD=password psql -U myuser < myscript.sql
вы можете найти это полезным: командная строка Windows PSQL: есть ли способ разрешить вход без пароля?
Я считаю, что psql show password prompt даже вы определяете переменную pgpassword, но вы можете указать опцию-w для psql, чтобы опустить запрос пароля.