Як вказати пароль на "psql" неінтерактивно?


337

Я намагаюся автоматизувати процес створення бази даних за допомогою сценарію оболонки, і одне, що я потрапив у дорожній блок із передачею пароля на psql . Ось трохи коду зі сценарію оболонки:

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

Як мені передати пароль psqlнеінтерактивним способом?


1
Ви можете використовувати URL-з'єднання. Перевірте ці відповіді в stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani

Відповіді:


141

З офіційної документації :

Також зручно мати файл ~ / .pgpass, щоб уникнути регулярного введення паролів. Див. Розділ 30.13 для отримання додаткової інформації.

...

Цей файл повинен містити рядки наступного формату:

hostname:port:database:username:password

Буде використано поле пароля з першого рядка, що відповідає поточним параметрам з'єднання.


29
Дякую, я знаю про pgpass, але це не вирішує проблему - мені потрібен автономний скрипт bash для роботи над базою даних, звідси моє питання про передачу інформації до psql через командний рядок.
Олексій Н.

6
Я думаю, що ваш єдиний варіант - встановити .pgpass-файл, до якого має доступ ваш скрипт bash. Або взагалі не використовуйте паролі - ви можете встановити іншу форму аутентифікації, таку як ідентифікація або використовуючи сертифікати SSL.
Flimzy

Ось чого я боявся :) Дякую за інформацію!
Олексій Н.

Іншим варіантом може бути використання очікування. Але я дуже ненавиджу очікування :)
Flimzy

1
Не забудьте видалити груповий та інший дозвіл користувача на читання, запис, виконання .pgpass-файлу! Виконатиchmod go-rwx .pgpass
Владислав Довгалець

611

Встановіть змінну середовища PGPASSWORD всередині скрипту перед тим, як викликати psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Для ознайомлення див. Http://www.postgresql.org/docs/current/static/libpq-envars.html


Редагувати

Оскільки Postgres 9.2 є також можливість вказати рядок з'єднання або URI, який може містити ім'я користувача та пароль.

Використання цього є ризиком для безпеки, оскільки пароль видно у простому тексті при перегляді командного рядка запущеного процесу, наприклад, за допомогою ps(Linux), ProcessExplorer (Windows) або подібних інструментів інших користувачів.

Дивіться також це питання про адміністраторів баз даних


32
Наприклад, в одному рядку ви можете зробити щось на кшталт: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
Я думаю, що це найзручніший спосіб просто запустити сценарій SQL.
zr870

2
Я можу лише додати - додати spaceв командний рядок до першого символу, і команда не зберігатиметься в історії башів. Працює для ubuntu / bash.
baldr

5
БОНУС: Працює для Докера:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Білал Акіл

3
Будьте обережні і обов'язково додайте попереднє пробіл, інакше він відобразиться у вашій історії
башів

102
  • в одному рядку:

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    з командою sql, така як"select * from schema.table"

  • або більше для читання:

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")
    

18
Один рядок можна трохи спростити до: PGPASSWORD='password' psql .... що також має перевагу, що змінна не буде доступною після виконання команди.
Гаррет

3
export PGPASSWORD=YourNewPasswordпрацював на мене над іншими варіаціями.
Мікеум

7
export PGPASSWORDзвучить, як насправді, погана ідея
Hasen

1
Це збереже пароль у вашому файлі історії ~ / .bash_history (якщо ви ретельно не додаєте попереднє пробіл), а також експортує пароль у ваше поточне середовище FWIW: |
rogerdpack

68

Я прагну віддавати URL-адресу psql :

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

Це дає мені свободу називати свої змінні середовища за бажанням і уникає створення зайвих файлів.

Для цього потрібно libpq. Документацію можна знайти тут .


чи можете ви використовувати щось подібне за допомогою pg_restore? Дякую!
the_ccalderon

1
@ ccalderon911217 Мабуть, ви можете: stackoverflow.com/a/28359470/1388292
Жак

@JacquesGaudin так випробував себе! Дякую!
the_ccalderon

26

У Windows:

  1. Призначте значення PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Виконати команду: C:\>psql -d database -U user

Готовий

Або в один рядок,

set PGPASSWORD=pass&& psql -d database -U user

Зверніть увагу на брак місця перед &&!


1
Я спробував це, і це не вийшло. Ще запитують пароль.
антипатерн

1
@antipattern Ви також повинні пройти варіант -w.
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"працює.
Стів Шипвей

21

Це можна зробити, створивши .pgpassфайл у домашній каталог користувача (Linux). .pgpass формат файлу:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

Ви також можете використовувати wild card *замість деталей.

Скажіть, я хотів бігти, tmp.sqlне вимагаючи пароля.

За допомогою наступного коду ви можете у файлі * .sh

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        

11
Який сенс відлуння "" chmod 0600 $ HOME / .pgpass `"? Як щодо просто chmod 0600 $ ДОМАШНЯ / .pgpass?
Влад Патришев

12

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

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

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

postgres=>

4

Додано вміст pg_env.sh до мого .bashrc:

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

з додаванням (відповідно до пропозиції користувача4653174)

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