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


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

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

psql -Umyuser < myscript.sql

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

12 208

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 file - это путь.

действия:

  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] не работает.

затем, как сказал Каваклиоглу в одном из комментариев,

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, вам не придется использовать -h myserver на -pmyport или -Ujdoe флаг, если вы используете по умолчанию ( 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 user-w