Як користуватися 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 vars.
kevlarr

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

Це призведе вас до постгресів без запиту про введення пароля, без необхідності встановлювати змінні середовища. Це не постійна установка.


Не робіть цього: пароль буде видно на виході ps -ef.
Colin 't Hart
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.