Postgresql: выполнение сценариев psql с паролем

Как я могу назвать psql в Так что не запрашивает пароль?

вот что у меня есть:

psql -Umyuser < myscript.sql

однако я не смог найти аргумент, который передает пароль, и поэтому psql всегда запрашивает его.

12 ответов


существует несколько способов аутентификации в PostgreSQL. Возможно, вы захотите изучить альтернативы аутентификации по паролю вhttps://www.postgresql.org/docs/current/static/client-authentication.html.

чтобы ответить на ваш вопрос, есть несколько способов предоставить пароль для аутентификации на основе пароля. Очевидный способ - через подсказку пароля. Вместо этого вы можете указать пароль в файле pgpass или через PGPASSWORD переменные среды. Смотри:

нет возможности указать пароль в качестве аргумента командной строки, поскольку эта информация часто доступна всем пользователям и поэтому небезопасна. Однако в средах Linux / Unix вы можете предоставить переменную среды для одной команды, например это:

PGPASSWORD=yourpass psql ...

PGPASSWORD=[your password] psql -Umyuser < myscript.sql

вы можете добавить эту командную строку в начале вашего скрипта:

set PGPASSWORD=[your password]

Если вы собираетесь иметь несколько хостов / подключений к базе данных,~/.файл pgpass - это путь.

действия:

  1. создать ~/.файл pgpass. Введите информацию в следующем формате имя хоста: порт: база данных: имя пользователя: пароль
  2. не добавляйте строковые кавычки вокруг значений полей. Вы также можете использовать * в качестве подстановочного знака для полей порта/базы данных.
  3. создайте псевдоним в своем профиле bash, который запускает ваш psql команда для вас. Например:alias postygresy='psql --host hostname database_name -U username' значения должны соответствовать тем, которые вы указали в ~/.файл pgpass.
  4. источник вашего профиля bash.
  5. введите псевдоним из командной строки.

обратите внимание, что если у вас есть набор переменных 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, я думаю, что лучшее общее решение заключается в следующем:

  1. напишите свой собственный временный файл pgpass с паролем, который вы хотите использовать.
  2. используйте переменную среды PGPASSFILE, чтобы сообщить psql использовать этот файл.
  3. удалите временный файл 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 вам не придется использовать -hmyserver, the -pmyport или -Uipetrov вместо флаг, если вы используете по умолчанию (localhost в : 5432) и только один пользователь базы данных. Для нескольких пользователей (но соединение по умолчанию) измените эту строку к

psql mydb jdoe

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

chmod +x runpsql (или как вы называете файл сценария)


Это можно сделать просто с помощью PGPASSWORD. Я использую psql 9.5.10. В вашем случае решение будет

PGPASSWORD=password psql -U myuser < myscript.sql



Я считаю, что psql show password prompt даже вы определяете переменную pgpassword, но вы можете указать опцию-w для psql, чтобы опустить запрос пароля.


использовать -w в команде: psql-h localhost-P 5432-U пользователь-w