Як я можу викликати 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
подібним або подібним.Зауважте, що якщо у вас встановлена експортна PGPASSWORD = '' змінна, вона матиме перевагу над файлом.
chmod 600
файл у файлі, інакше psql
він мовчки проігнорує його (згідно з документами).
Це може бути давнє питання, але є альтернативний метод, який ви можете використовувати, про який ніхто не згадував. Можна вказати пароль безпосередньо в URI з'єднання. Документацію можна знайти тут , альтернативно тут .
Ви можете вказати своє ім’я користувача та пароль безпосередньо в URI з'єднання, наданому psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
Якщо у вас виникають проблеми з такими Windows, як я (я використовую 64-бітну Windows 7) і set PGPASSWORD=[Password]
не працювали.
Потім, як сказав Кавакліоглу в одному з коментарів,
export PGPASSWORD=[password]
Вам потрібно буде зберегти це у верхній частині файлу або перед будь-яким використанням, щоб його встановити до виклику.
Звичайно працює на windows :)
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
Спираючись на відповідь 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 , -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) і друкує його ім'я для stdout.
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 років ...
На моєму комп'ютері мені довелося вписати рядок у файл на
~/.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, щоб пропустити підказку пароля.