Как я могу вызвать 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
Вы можете добавить эту командную строку в начале вашего скрипта:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
работала
#!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
PGPASSWORD=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 = '', она будет иметь приоритет над файлом.
chmod 600
файл, иначе он psql
будет игнорироваться (в соответствии с документами).
Это может быть старый вопрос, но есть альтернативный метод, который вы можете использовать, который никто не упомянул. Можно указать пароль непосредственно в URI подключения. Документация может быть найдена здесь , или здесь .
Вы можете указать свое имя пользователя и пароль непосредственно в URI соединения, предоставленного psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
Если у вас проблемы с Windows, как я (я использую Windows 7 64-разрядная версия) и set PGPASSWORD=[Password]
не работает.
Затем, как сказал Каваклиоглу в одном из комментариев,
export PGPASSWORD=[password]
Вам нужно будет сохранить это в верхней части файла или перед любым использованием, чтобы его установить перед вызовом.
Конечно, работает на окнах :)
export PGPASSWORD=[password]
у меня вообще не работает с использованием командной строки (cmd.exe). Вы уверены, что не использовали Cygwin или что-то подобное?
Вы должны создать файл пароля: см. Http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html для получения дополнительной информации.
Учитывая проблемы безопасности при использовании переменной среды 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
Основываясь на ответе mightybyte для тех, кто не знаком с сценариями * 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 - точно так же, как и в случае ошибки « not plain file », описанной в mightybyte , также есть ошибка « permissions », если это не сделано.
В строке 7 вам не нужно будет использовать -h
флаг myserver , -p
myport или -U
jdoe, если вы используете значения по умолчанию ( localhost : 5432 ) и имеете только одного пользователя базы данных. Для нескольких пользователей (но подключение по умолчанию) измените эту строку на
psql mydb jdoe
Не забудьте сделать скрипт исполняемым с
chmod +x runpsql
( или как вы назвали файл скрипта )
ОБНОВИТЬ:
Я воспользовался советом RichVel и сделал файл нечитаемым, прежде чем вводить в него пароль. Это закрывает небольшую дыру в безопасности. Спасибо!
mktemp
для создания временного файла вместо того, чтобы придумать свою собственную схему именования. Он создает новый временный файл (названный как-то как /tmp/tmp.ITXUNYgiNh
в Linux и /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
в MacOS X) и выводит его имя на стандартный вывод.
chmod 600
после создания файла, но перед тем, как записать в него пароль. Как написано, вредоносный скрипт на сервере может постоянно пытаться читать файлы этого формата, и иногда ему удается получить пароль. Кроме того, если этот сценарий по какой-то причине прервется, файл останется на диске - запись trap
обработчика оболочки решит эту проблему. Учитывая, что написать такой безопасный сценарий нетривиально, я рекомендую использовать export PGPASSWORD
вместо него.
PGPASSWORD
что устарело в 9.3.
Альтернативой использованию PGPASSWORD
переменной среды является использование conninfo
строки в соответствии с документацией
Альтернативный способ указать параметры соединения - это строка conninfo или URI, который используется вместо имени базы данных. Этот механизм дает вам очень широкий контроль над соединением.
$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"
postgres=>
Вы можете найти это полезным: Командная строка Windows 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, чтобы пропустить запрос пароля.