Как указать пароль для psql неинтерактивно?


338

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

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

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


1
Вы можете использовать URL-адрес подключения. Проверьте это ответы в stackoverflow.com/questions/3582552/postgres-connection-url .
paulodiovani

Ответы:


140

Из официальной документации :

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

...

Этот файл должен содержать строки следующего формата:

hostname:port:database:username:password

Будет использовано поле пароля из первой строки, соответствующее текущим параметрам соединения.


29
Спасибо, я знаю о pgpass, но это не решает проблему - мне нужен автономный скрипт bash для работы с базой данных, поэтому мой вопрос о передаче информации в psql через командную строку.
Алекс Н.

6
Я думаю, что ваш единственный вариант - установить файл .pgpass, к которому у вашего bash-скрипта есть доступ. Или вообще не используйте пароли - вы могли бы установить другую форму аутентификации, например, для att или использовать SSL-сертификаты.
Хлипкий

Вот чего я боялся :) Спасибо за информацию!
Алекс Н.

Другим вариантом может быть использование ожидаемого. Но я действительно ненавижу ожидать :)
Flimzy

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

612

Установите переменную окружения 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в командной строке перед первым символом, и команда не будет сохранена в истории Bash. Работает на Ubuntu / Bash.
baldr

5
БОНУС: Работает на Докера:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Билал Акил

3
Будьте осторожны и всегда добавляйте предшествующий пробел, иначе он будет отображаться в вашем файле истории bash ~ / .bash_history ...
rogerdpack

103
  • в одну строку:

    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работал для меня над другими вариациями.
Mikeumus

7
export PGPASSWORDзвучит как очень плохая идея
hasen

1
Это сохранит пароль в файле истории bash ~ / .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>

Вы также можете использовать подстановочный знак *вместо деталей.

Скажем, я хотел запустить 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 $ HOME / .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

с добавлением (согласно предложению user4653174)

export PGPASSWORD='password'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.