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

188

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

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

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

Спасибо!

Теги:
command-line

7 ответов

84
Лучший ответ

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

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

...

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

hostname:port:database:username:password

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

  • 22
    Спасибо, я знаю о pgpass, но это не решает проблему - мне нужен автономный скрипт bash для работы с базой данных, поэтому мой вопрос о передаче информации в psql через командную строку.
  • 6
    Я думаю, что ваш единственный вариант - установить файл .pgpass, к которому у вашего bash-скрипта есть доступ. Или вообще не используйте пароли - вы можете настроить другую форму аутентификации, такую как идентификатор, или использовать сертификаты SSL.
Показать ещё 4 комментария
374

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

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

  • 31
    Например, в одной строке вы можете сделать что-то вроде: PGPASSWORD = pass1234 psql -u MyUsername myUserName
  • 3
    Я думаю, что это самый удобный способ для простого запуска сценария SQL.
Показать ещё 3 комментария
74
  • в одной строке:

    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")
    
  • 17
    Одна строка может быть немного упрощена до: PGPASSWORD='password' psql .... которая также имеет преимущество в том, что переменная недоступна после выполнения команды.
  • 1
    export PGPASSWORD=YourNewPassword работал для меня над другими вариантами.
Показать ещё 2 комментария
17

Это можно сделать, создав файл .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
    Какой смысл эха "` chmod 0600 $ HOME / .pgpass `"? Как насчет просто chmod 0600 $ HOME / .pgpass?
10

В Windows:

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

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

готов

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

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

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

  • 0
    Я попробовал это, и это не сработало. Все еще просят пароль.
  • 0
    Работал хорошо для меня - PSQL версия 10.3
Показать ещё 1 комментарий
6

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

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

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

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

  • 1
    Этот работает отлично! Спасибо...!!
  • 0
    работает отлично.
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню