Как мне указать пароль для psql неинтерактивно? - PullRequest
254 голосов
/ 20 июня 2011

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

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

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

Спасибо!

Ответы [ 7 ]

467 голосов
/ 20 июня 2011

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

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

109 голосов
/ 20 июня 2011

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

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

...

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

hostname:port:database:username:password

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

90 голосов
/ 10 марта 2015
  • в одну строку:

    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")
    
28 голосов
/ 26 апреля 2018

Я предпочитаю передавать URL для psql:

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

Это дает мне свободу именовать переменные среды по своему желанию и позволяет избежать создания ненужных файлов.

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

19 голосов
/ 19 сентября 2016

В Windows:

  1. Назначить значение PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Команда запуска: C:\>psql -d database -U user

Готов

Или в одну строку

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

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

19 голосов
/ 28 марта 2012

Это можно сделать, создав файл .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 `        
1 голос
/ 17 апреля 2019

Добавлен контент файла 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...