Postgresql: выполнение скриптов psql с паролем

Как я могу вызвать psql, чтобы он не запрашивал пароль?

Это то, что у меня есть:

psql -Umyuser < myscript.sql

Однако я не мог найти аргумент, который передает пароль, и поэтому psql всегда запрашивает его.

Ответ 1

Есть несколько способов аутентификации в PostgreSQL. Вы можете изучить альтернативы аутентификации по паролю на https://www.postgresql.org/docs/current/static/client-authentication.html.

Чтобы ответить на ваш вопрос, есть несколько способов предоставить пароль для аутентификации на основе пароля. Очевидный способ - через приглашение пароля. Вместо этого вы можете указать пароль в файле pgpass или через переменную окружения PGPASSWORD. Смотрите эти:

Невозможно указать пароль в качестве аргумента командной строки, поскольку эта информация часто доступна всем пользователям и поэтому небезопасна. Однако в средах Linux/Unix вы можете предоставить переменную среды для одной команды, например:

PGPASSWORD=yourpass psql ...

Ответ 2

PGPASSWORD=[your password] psql -Umyuser < myscript.sql

Ответ 3

Вы можете добавить эту командную строку в начале вашего script:

set PGPASSWORD=[your password]

Ответ 4

Если вы намереваетесь использовать несколько хостов/соединений с базой данных, ~/.pgpass файл - это то, что вам нужно.

Этапы:

  1. Создайте файл, используя vim ~/.pgpass или аналогичный. Введите вашу информацию в следующем формате: hostname:port:database:username:password Не добавляйте строковые кавычки вокруг значений вашего поля. Вы также можете использовать * в качестве подстановочного знака для полей порта/базы данных.
  2. Вы должны chmod 0600 ~/.pgpass, чтобы psql не игнорировал его.
  3. Создайте псевдоним в вашем профиле bash, который запускает вашу команду psql. Например: alias postygresy='psql --host hostname database_name -U username' Значения должны соответствовать тем, которые вы ввели в файл ~/.pgpass.
  4. Источник вашего профиля Bash с . ~/.bashrc или аналогичным.
  5. Введите свой псевдоним из командной строки.

Обратите внимание, что если у вас установлена переменная export PGPASSWORD = '', она будет иметь приоритет над файлом.

Ответ 5

Это может быть старый вопрос, но есть альтернативный метод, который вы можете использовать, который никто не упомянул. Можно указать пароль непосредственно в URI соединения. Документацию можно найти здесь, в качестве альтернативы здесь.

Вы можете указать свое имя пользователя и пароль непосредственно в URI подключения, предоставленном psql:

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:[email protected]:5432/mydb

Ответ 7

Если у вас проблемы с такими окнами, как я (я использую 64-разрядную версию Windows 7), а set PGPASSWORD=[Password] не работает.

Затем, как сказал Каваклиоглу в одном из комментариев,

export PGPASSWORD=[password]

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

Конечно, работает над окнами:)

Ответ 8

Учитывая проблемы безопасности, связанные с использованием переменной среды PGPASSWORD, я считаю, что лучшее общее решение выглядит следующим образом:

  • Напишите свой собственный временный файл pgpass с паролем, который вы хотите использовать.
  • Используйте переменную среды PGPASSFILE, чтобы сообщить psql, чтобы использовать этот файл.
  • Удалить временный файл pgpass

Здесь есть несколько замечаний. Шаг 1 заключается в том, чтобы избежать сбрасывания файла пользователя ~/.pgpass, который может существовать. Вы также должны убедиться, что файл имеет разрешения 0600 или меньше.

Некоторые предложили использовать bash, чтобы сократить это следующим образом:

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

В этом случае используется синтаксис <(), чтобы избежать необходимости записывать данные в фактический файл. Но это не работает, потому что psql проверяет, какой файл используется, и выдает ошибку, подобную этой:

WARNING: password file "/dev/fd/63" is not a plain file

Ответ 9

Это можно сделать просто с помощью PGPASSWORD. Я использую PSQL 9.5.10. В вашем случае решение будет

PGPASSWORD=password psql -U myuser < myscript.sql

Ответ 10

Основываясь на могущественном ответе для тех, кто не знаком с сценариями * nix shell, вот рабочий сценарий:

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

Двойной знак доллара ($$) в /tmp/pgpasswd$$ в строке 2 добавляет идентификационный номер процесса к имени файла, чтобы этот сценарий можно было запускать несколько раз, даже одновременно, без побочных эффектов.

Обратите внимание на использование команды chmod в строке 4 - точно так же, как ошибка "не простой файл", описанная mightybyte, также есть ошибка "permissions", если это не сделано.

В строке 7 вам не нужно будет использовать myserver -h, myport -p или jdoe -U, если вы используете значения по умолчанию (localhost: 5432) и имеете только одного пользователя базы данных. Для нескольких пользователей (но подключение по умолчанию) измените эту строку на

psql mydb jdoe

Не забудьте сделать скрипт исполняемым с помощью

chmod +x runpsql (или как вы назвали файл скрипта)

UPDATE:

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

Ответ 14

Я нахожу, что psql показывает парольную подсказку, даже вы определяете переменную PGPASSWORD, но вы можете указать -w для psql опустить подсказку с паролем.

Ответ 15

Используйте -w в команде: psql -h localhost -p 5432 -U пользователь -w