Як я можу викликати 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 , -pmyport або -Ujdoe, якщо ви використовуєте за замовчуванням ( localhost : 5432 ) та лише одного користувача бази даних. Для декількох користувачів (але з'єднання за замовчуванням) змініть цю лінію на
psql mydb jdoe
Не забудьте зробити скрипт виконуваним з
chmod +x runpsql( або як би ви назвали файл сценарію )
ОНОВЛЕННЯ:
Я взяв поради RichVel і зробив файл нечитабельним, перш ніж вводити в нього пароль. Це закриває невеликий захисний отвір. Дякую!
mktempдля створення тимчасового файлу замість створення власної схеми іменування. Він створює новий темп-файл (названий як-то /tmp/tmp.ITXUNYgiNhв Linux та /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4MacOS 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, щоб пропустити підказку пароля.