Postgresql: Сценарій виконання psql паролем


274

Як я можу викликати psql, щоб він не запросив пароль ?

Ось що я маю:

psql -Umyuser < myscript.sql

Однак я не зміг знайти аргумент, який передає пароль, і тому psql завжди вимагає його.


4
Я закінчив переходити до змінної середовища PGPASSWORD. Це ідеально підходило моєму шафу. Простий і самодостатній у сценарії.
Аксель Фонтен

Щойно знайшли це postgresguide.com/utilities/psql.html
D_C

Відповіді:


315

Існує кілька способів аутентифікації на PostgreSQL. Ви можете вивчити альтернативи автентифікації паролів за посиланням https://www.postgresql.org/docs/current/static/client-authentication.html .

Щоб відповісти на ваше запитання, існує декілька способів ввести пароль для автентифікації на основі пароля. Очевидний спосіб - через запит на пароль. Замість цього ви можете вказати пароль у файлі pgpass або через PGPASSWORDзмінну оточення. Дивіться такі:

Немає можливості надати пароль як аргумент командного рядка, оскільки ця інформація часто доступна для всіх користувачів, а отже, небезпечна. Однак у середовищах Linux / Unix ви можете надати змінну середовища для однієї команди на зразок цієї:

PGPASSWORD=yourpass psql ...

11
Я думаю, що PGPASSWORD застаріле, але все ще працює, btw. Just FYI
Скотт Марлоу

35
Так, це застаріло (і так зазначається в одному з посилань). Оскільки він з'явився, напевно, також варто відзначити, що знищення жорстоко оскаржується, оскільки воно є надзвичайно корисним для багатьох людей, але його можна використовувати в деяких обставинах без серйозних проблем безпеки. Мені здається, що це не гірше, ніж, наприклад, зберігати .pgpass у файловій системі NFS. Я використовую PGPASSWORD звичайно.
Рис

1
ідея про те, що інформація командного рядка "доступна всім користувачам", базується на застарілих припущеннях про багатокористувацькі системи і не застосовується в більшості сучасних середовищ, де системи просто запускають одну програму і все автоматизовано
Alex R

159
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

1
це працює і в тераформі. ти, мій друже, рятувальник життя
wildthing81

67

Ви можете додати цей командний рядок на початку вашого сценарію:

set PGPASSWORD=[your password]

24
в моєму випадку команда set не працювала, але export PGPASSWORD=[password]працювала
Can Kavaklıoğlu

він не працює в сценарії оболонки. Я ним користуюся #!/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
Говінд Гупта,

2
Спробуйте не використовувати пробіли, наприклад. PGPASSWORD=password.
Арієджан

48

Якщо ви маєте намір підключити декілька хостів / баз даних, файл ~ / .pgpass - це шлях.

Кроки:

  1. Створіть файл за допомогою vim ~/.pgpassабо подібного. Введіть свою інформацію у такому форматі: hostname:port:database:username:passwordНе додайте рядкові лапки навколо значень поля. Ви також можете використовувати * як підстановку для полів вашого порту / бази даних.
  2. Ви повинні chmod 0600 ~/.pgpassдля того, щоб psql мовчки не ігнорували його.
  3. Створіть псевдонім у своєму профілі bash, який виконує вашу команду psql. Наприклад: alias postygresy='psql --host hostname database_name -U username'значення повинні відповідати тим, які ви ввели у файл ~ / .pgpass-файл.
  4. Джерело вашого bash профілю з . ~/.bashrcподібним або подібним.
  5. Введіть свій псевдонім у командному рядку.

Зауважте, що якщо у вас встановлена ​​експортна PGPASSWORD = '' змінна, вона матиме перевагу над файлом.


1
Ви повинні зробити chmod 600файл у файлі, інакше psqlвін мовчки проігнорує його (згідно з документами).
RichVel

33

Це може бути давнє питання, але є альтернативний метод, який ви можете використовувати, про який ніхто не згадував. Можна вказати пароль безпосередньо в URI з'єднання. Документацію можна знайти тут , альтернативно тут .

Ви можете вказати своє ім’я користувача та пароль безпосередньо в URI з'єднання, наданому psql:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

2
Postrgres 9.3 ігнорує змінну середовищаPGPASSWORD
david.perez

14

Якщо у вас виникають проблеми з такими Windows, як я (я використовую 64-бітну Windows 7) і set PGPASSWORD=[Password]не працювали.

Потім, як сказав Кавакліоглу в одному з коментарів,

export PGPASSWORD=[password]

Вам потрібно буде зберегти це у верхній частині файлу або перед будь-яким використанням, щоб його встановити до виклику.

Звичайно працює на windows :)


1
export PGPASSWORD=[password]не працює для мене, використовуючи командний рядок (cmd.exe) взагалі. Ви впевнені, що не використовували cygwin чи щось подібне?
Девін Снайдер

Працює лише з cl, ви додали його у файл, правильно? Тепер просто набрав його в команду?
Джеймі Хатбер

це нормально використовувати його в середовищі Linux / mac, для Windows, я думаю, ви повинні знайти спосіб експорту цієї змінної середовища.
Pengfei.X

Тож додайте глобальний пароль ... Це також цікава ідея
Джеймі Хатбер


7

Враховуючи проблеми безпеки щодо використання змінної середовища PGPASSWORD, я думаю, що найкращим загальним рішенням є таке:

  1. Напишіть власний тимчасовий pgpass-файл із паролем, який ви хочете використовувати.
  2. Використовуйте змінну середовища PGPASSFILE, щоб сказати psql використовувати цей файл.
  3. Видаліть тимчасовий файл pgpass

Тут є кілька приміток. Крок 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

Робочий приклад такого підходу з’являється в stackoverflow.com/a/40614592/3696363 - ще одна відповідь на це питання.
Eliyahu Skoczylas

Хоча цей користувач не дуже просив того самого, що я шукав, я б сказав, що підхід не відповідає. Використовуючи синтаксис PGPASSFILE = <(що б там не було), ви можете робити такі речі, як розшифровка файлу, і мати його лише у створеному дескрипторі файлу. Написавши тимчасовий файл, ви принципово не вирішите проблему наявності файлу на диску з обліковими записами. Не весело спілкуватися з такими довільними галузевими правилами, але це справа, з якою багато людей.
Десідеро

7

Це можна зробити просто за допомогою PGPASSWORD. Я використовую psql 9.5.10. У вашому випадку рішення було б

PGPASSWORD=password psql -U myuser < myscript.sql


5

Спираючись на відповідь mogoybyte для тих, кому не комфортно сценарій * 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 - так само, як помилка " не простий файл ", яка описана може бути байтом , також існує помилка " дозволів ", якщо це не зроблено.

У рядку 7 вам не доведеться використовувати -hпрапор myserver , -pmyport або -Ujdoe, якщо ви використовуєте за замовчуванням ( localhost : 5432 ) та лише одного користувача бази даних. Для декількох користувачів (але з'єднання за замовчуванням) змініть цю лінію на

psql mydb jdoe

Не забудьте зробити скрипт виконуваним з

chmod +x runpsql( або як би ви назвали файл сценарію )

ОНОВЛЕННЯ:

Я взяв поради RichVel і зробив файл нечитабельним, перш ніж вводити в нього пароль. Це закриває невеликий захисний отвір. Дякую!


4
Ви можете використовувати mktempдля створення тимчасового файлу замість створення власної схеми іменування. Він створює новий темп-файл (названий як-то /tmp/tmp.ITXUNYgiNhв Linux та /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4MacOS X) і друкує його ім'я для stdout.
Іван Колмичек

1
Проблема безпеки Найкраще це робити chmod 600після створення файлу, але перед тим, як записати пароль до нього. Як було написано, зловмисний скрипт на сервері міг постійно намагатися читати файли такого формату, а інколи вдасться отримати пароль. Крім того, якщо цей скрипт буде перервано з якоїсь причини, файл залишиться на диску - написання trapобробника оболонки вирішить це. Зважаючи на те, що писати захищений скрипт, як це, не рекомендується, рекомендую використовувати export PGPASSWORDзамість цього.
RichVel

Дякую, @RichVel за вказівку на цю маленьку дірку в безпеці. Торкніться створення та зробити файл приватним перед тим, як ввести пароль, це певне вдосконалення. Таке рішення потрібне, оскільки PGPASSWORDвоно було застарілим у 9.3.
Eliyahu Skoczylas

Деякі документи кажуть, що вона застаріла, але, як згадується в коментарі в цьому запитанні , припинення оскаржується, і воно як і раніше працює на Postgres 10.6
RichVel

5

Альтернативою для використання PGPASSWORDзмінної середовища є використання conninfoрядка відповідно до документації

Альтернативний спосіб визначення параметрів з'єднання - це рядок conninfo або URI, який використовується замість імені бази даних. Цей механізм дає вам дуже широкий контроль над з'єднанням.

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>


1

Через 8 років ...

На моєму комп'ютері мені довелося вписати рядок у файл на ~/.pgpassзразок:

<IP>:<PORT>:<dbname>:<user>:<password>

Також дивіться:
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass


Не використовуйте -W для psql, якщо ви використовуєте .pgpass. Цей параметр скасувати .pgpass використання.
avvensis

-1

Я вважаю, що psql показує підказку пароля, навіть якщо ви визначаєте змінну PGPASSWORD, але ви можете вказати опцію -w для psql, щоб пропустити підказку пароля.


-6

Використовуйте -w у команді: psql -h localhost -p 5432 -U користувач -w

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.