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

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

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

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

Спасибо!

Ответ 1

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

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

...

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

hostname:port:database:username:password

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

Ответ 2

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

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

Ответ 3

  • в одной строке:

    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")
    

Ответ 4

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

psql "postgresql://$DB_USER:[email protected]$DB_SERVER/$DB_NAME"

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

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

Ответ 5

Это можно сделать, создав файл .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 `        

Ответ 6

В Windows:

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

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

готов

Или в одной строке,

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

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

Ответ 7

export PGPASSWORD = ${PGPASSWORD-пароль}

Ответ 8

Добавил содержимое файла 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'