Как я могу вызвать psql, чтобы он не запрашивал пароль?
Это то, что у меня есть:
psql -Umyuser < myscript.sql
Однако я не мог найти аргумент, который передает пароль, и поэтому psql всегда запрашивает его.
Есть несколько способов аутентификации в 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
Вы можете добавить эту командную строку в начале вашего script:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
работал
SET
должен работать на Windows.
Если вы намереваетесь иметь несколько хостов/соединений с базой данных, ~/.pgpass file - путь.
Шаги:
alias postygresy='psql --host hostname database_name -U username'
Значения должны совпадать с значениями, введенными в файл ~/.pgpass.Обратите внимание, что если у вас есть установленная переменная PGPASSWORD = '', она будет иметь приоритет над файлом. Также разумно изменить разрешения вашего файла, чтобы содержимое было скрыто от других пользователей. Этого можно достичь с помощью chmod 600 ~/.pgpass
chmod 600
для файла, иначе psql
будет молча игнорировать его (согласно документации).
Вам нужно создать файл паролей: см. http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html для получения дополнительной информации.
Если у вас проблемы с такими окнами, как я (я использую 64-разрядную версию Windows 7), а set PGPASSWORD=[Password]
не работает.
Затем, как сказал Каваклиоглу в одном из комментариев,
export PGPASSWORD=[password]
Вам нужно будет сохранить это в верхней части файла или перед любым использованием, поэтому его набор перед вызовом.
Конечно, работает над окнами:)
export PGPASSWORD=[password]
у меня вообще не работает с использованием командной строки (cmd.exe). Вы уверены, что не использовали Cygwin или что-то подобное?
Основываясь на могучем ответить тем, кто не устраивает скрипты * nix shell, здесь работает script:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
chmod 600 $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
Двойной знак доллара ($$
) в /tmp/pgpasswd$$
в строке 2 добавляет идентификатор процесса к имени файла, так что этот script можно запускать более одного раза, даже одновременно, без побочных эффектов.
Обратите внимание на использование команды chmod
в строке 4 - так же, как описанная mightybyte ошибка "не простой файл", также есть ошибка "разрешения", если это не сделано.
В строке 6 вам не нужно использовать -h
myserver, флаг -p
myport или -U
jdoe, если вы используете настройки по умолчанию (localhost: 5432) и имеете только одного пользователя базы данных. Для нескольких пользователей (но соединение по умолчанию) измените эту строку на
psql mydb jdoe
Не забудьте сделать исполняемый файл script с
chmod +x runpsql
(или все, что вы назвали файлом script)
mktemp
для создания временного файла вместо того, чтобы придумывать собственную схему именования. Он создает новый временный файл (с именем что-то вроде /tmp/tmp.ITXUNYgiNh
в Linux и /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
на MacOS X) и печатает его имя в stdout.
chmod 600
после создания файла, но перед тем, как записать в него пароль. Как написано, вредоносный сценарий на сервере может постоянно пытаться читать файлы этого формата, и иногда ему удается получить пароль. Кроме того, если этот сценарий по какой-то причине прервется, файл останется на диске - запись обработчика trap
оболочки решит эту проблему. Учитывая, что написать такой безопасный сценарий нетривиально, я рекомендую вместо этого использовать export PGPASSWORD
.
Учитывая проблемы безопасности, связанные с использованием переменной среды PGPASSWORD, я считаю, что лучшее общее решение выглядит следующим образом:
Здесь есть несколько замечаний. Шаг 1 заключается в том, чтобы избежать сбрасывания файла пользователя ~/.pgpass, который может существовать. Вы также должны убедиться, что файл имеет разрешения 0600 или меньше.
Некоторые предложили использовать bash, чтобы сократить это следующим образом:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
В этом случае используется синтаксис <(), чтобы избежать необходимости записывать данные в фактический файл. Но это не работает, потому что psql проверяет, какой файл используется, и выдает ошибку, подобную этой:
WARNING: password file "/dev/fd/63" is not a plain file
Это можно сделать просто с помощью PGPASSWORD. Я использую PSQL 9.5.10. В вашем случае решение будет
PGPASSWORD=password psql -U myuser < myscript.sql
Вы можете найти это полезным: Командная строка Windows PSQL: есть ли способ разрешить вход в систему без пароля?
Как насчет использования полной строки и позволить psql разобрать ее?
Это может быть старый вопрос, но есть альтернативный метод, который вы можете использовать, который никто не упомянул. Можно указать пароль прямо в URI соединения. Документация может быть найдена здесь, или здесь.
Вы можете указать свое имя пользователя и пароль непосредственно в URI подключения, предоставленном psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5433/mydb
PGPASSWORD
Я нахожу, что psql показывает парольную подсказку, даже вы определяете переменную PGPASSWORD, но вы можете указать -w для psql опустить подсказку с паролем.
Используйте -w в команде: psql -h localhost -p 5432 -U пользователь -w