Как использовать PSQL без запроса пароля?


70

Я написал скрипт для REINDEXиндексов в базе данных. Вот один из них:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

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

  1. Я не могу создать пользователя в базе данных без пароля.

  2. Поскольку REINDEXблокирует таблицы, я должен использовать sleep <num>между ними REINDEX.

Есть ли автоматическое решение?

Ответы:


111

У вас есть четыре варианта ввода пароля:

  1. установите переменную окружения PGPASSWORD. Подробности см. В руководстве:
    http://www.postgresql.org/docs/current/static/libpq-envars.html.
  2. используйте файл .pgpass для хранения пароля. Подробности см. В руководстве:
    http://www.postgresql.org/docs/current/static/libpq-pgpass.html.
  3. используйте «доверительную аутентификацию» для этого конкретного пользователя:
    http://www.postgresql.org/docs/current/static/auth-methods.html#AUTH-TRUST
  4. используйте URI подключения, который содержит все:
    http://www.postgresql.org/docs/current/static/libpq-connect.html#AEN42532

4
Начиная с PostgreSQL 9.1 также существует peerметод аутентификации для локальных соединений. В настоящее время только для Linux, BSD, OS X или Solaris (не Windows).
Эрвин Брандштеттер,

1
Замечание о .pgpassопции, вы должны указать имя пользователя, базы данных, и имя хоста (если бы уже нормально) в psqlкоманде
Raphael

Что касается 3, вам нужно отредактировать метод. это объясняется здесь: gist.github.com/p1nox/4953113
FuzzyAmi

Легко использовать, export PGPASSWORD="your_pw"чтобы перейти к версии 1
gies0r

18

Простой пример с PGPASSWORDбудет что-то вроде:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Надеюсь, это поможет.


4
Привет, Ian_H, спасибо за твои комментарии, и я согласен с твоими замечаниями. Принятый ответ очень исчерпывающий, и это решило мою проблему. Причина, по которой я поставил свой ответ на этот старый пост, заключается в том, что он все еще не прост для меня, так как я считаю, что другие могут испытывать те же чувства.
ДПМ

Это определенно было хорошим дополнением к принятому ответу - полезным напоминанием о том, что нам не нужно постоянно устанавливать переменные ENV.
кевлар

1

В зависимости от разрешений вашей учетной записи в примере без указания базы данных может произойти сбой, поскольку разрешения пользователей проверяются по базе данных, к которой вы подключаетесь. Лучше явно указать базу данных тоже.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  

0

Очень полезные ответы в этой теме. Я просто добавляю это для Ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Это приведет вас в postgres без запроса пароля, без необходимости устанавливать какие-либо переменные окружения. Это не постоянная настройка.


Не делайте этого: пароль будет виден в выводе команды ps -ef.
Colin «т Харт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.