Как указать пароль для 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

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

Flimzy
источник
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) или аналогичных инструментов другими пользователями.

Смотрите также этот вопрос на администраторов базы данных

a_horse_with_no_name
источник
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")
user4653174
источник
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

Обратите внимание на недостаток места перед &&!

JAGJ jdfoxito
источник
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 `        
Srini
источник
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'
обкрадывать
источник