Как я могу вызвать psql, чтобы он не запрашивал пароль?
Это то, что у меня есть:
psql -Umyuser < myscript.sql
Однако я не мог найти аргумент, который передает пароль, и поэтому psql всегда запрашивает его.
Как я могу вызвать 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]
Если вы намереваетесь использовать несколько хостов/соединений с базой данных, ~/.pgpass файл - это то, что вам нужно.
Этапы:
vim ~/.pgpass
или аналогичный. Введите вашу информацию в следующем формате:
hostname:port:database:username:password
Не добавляйте строковые кавычки вокруг значений вашего поля. Вы также можете использовать * в качестве подстановочного знака для полей порта/базы данных.chmod 0600 ~/.pgpass
, чтобы psql не игнорировал его.alias postygresy='psql --host hostname database_name -U username'
Значения должны соответствовать тем, которые вы ввели в файл ~/.pgpass.. ~/.bashrc
или аналогичным.Обратите внимание, что если у вас установлена переменная export PGPASSWORD = '', она будет иметь приоритет над файлом.
Это может быть старый вопрос, но есть альтернативный метод, который вы можете использовать, который никто не упомянул. Можно указать пароль непосредственно в URI соединения. Документацию можно найти здесь, в качестве альтернативы здесь.
Вы можете указать свое имя пользователя и пароль непосредственно в URI подключения, предоставленном psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:[email protected]:5432/mydb
Вам нужно создать файл паролей: см. http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html для получения дополнительной информации.
Если у вас проблемы с такими окнами, как я (я использую 64-разрядную версию Windows 7), а set PGPASSWORD=[Password]
не работает.
Затем, как сказал Каваклиоглу в одном из комментариев,
export PGPASSWORD=[password]
Вам нужно будет сохранить это в верхней части файла или перед любым использованием, поэтому его набор перед вызовом.
Конечно, работает над окнами:)
Учитывая проблемы безопасности, связанные с использованием переменной среды 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
Основываясь на могущественном ответе для тех, кто не знаком с сценариями * nix shell, вот рабочий сценарий:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
Двойной знак доллара ($$
) в /tmp/pgpasswd$$
в строке 2 добавляет идентификационный номер процесса к имени файла, чтобы этот сценарий можно было запускать несколько раз, даже одновременно, без побочных эффектов.
Обратите внимание на использование команды chmod
в строке 4 - точно так же, как ошибка "не простой файл", описанная mightybyte, также есть ошибка "permissions", если это не сделано.
В строке 7 вам не нужно будет использовать myserver -h
, myport -p
или jdoe -U
, если вы используете значения по умолчанию (localhost: 5432) и имеете только одного пользователя базы данных. Для нескольких пользователей (но подключение по умолчанию) измените эту строку на
psql mydb jdoe
Не забудьте сделать скрипт исполняемым с помощью
chmod +x runpsql
(или как вы назвали файл скрипта)
UPDATE:
Я воспользовался советом RichVel и сделал файл нечитаемым, прежде чем вводить в него пароль. Это закрывает небольшую дыру в безопасности. Спасибо!
Вы можете найти это полезным: Командная строка Windows PSQL: есть ли способ разрешить вход в систему без пароля?
Как насчет использования полной строки и позволить psql разобрать ее?
8 лет спустя...
На моем Mac я должен был положить строку в файл
~/.pgpass
нравится:
<IP>:<PORT>:<dbname>:<user>:<password>
Также смотрите:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass
Я нахожу, что psql показывает парольную подсказку, даже вы определяете переменную PGPASSWORD, но вы можете указать -w для psql опустить подсказку с паролем.
Используйте -w в команде: psql -h localhost -p 5432 -U пользователь -w