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 file - это путь.
действия:
- создать ~/.файл 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]
не работает.затем, как сказал Каваклиоглу в одном из комментариев,
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 на-p
myport или-U
jdoe флаг, если вы используете по умолчанию ( localhost:5432) и только один пользователь базы данных. Для нескольких пользователей (но соединение по умолчанию) измените эту строку кpsql mydb jdoe
не забудьте сделать скрипт исполняемый файл С
chmod +x runpsql
(или как там вы назвали файл скрипта)
Это можно сделать просто с помощью PGPASSWORD. Я использую psql 9.5.10. В вашем случае решение будет
PGPASSWORD=password psql -U myuser < myscript.sql
вы можете найти это полезным: командная строка Windows PSQL: есть ли способ разрешить вход без пароля?