Postgresql: сценарий выполнения psql с паролем

221

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

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

psql -Umyuser < myscript.sql

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

  • 3
    В итоге я перешел к переменной окружения PGPASSWORD. Это идеально подошло для моего использования. Простой и автономный в сценарии.
  • 0
    Только что нашел этот postgresguide.com/utilities/psql.html
Теги:
database
psql
postgresql-9.0

14 ответов

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

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

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

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

PGPASSWORD=yourpass psql ...
  • 11
    Я думаю, что PGPASSWORD устарела, но все еще работает, кстати. Просто к вашему сведению
  • 27
    Да, это устарело (и так отмечено в одной из ссылок). Так как это подходит, вероятно, также стоит отметить, что обесценивание горячо оспаривается, потому что это чрезвычайно полезно для многих людей, но может использоваться в некоторых обстоятельствах без серьезных проблем безопасности. Мне кажется, что это не хуже, чем хранить .pgpass в файловой системе NFS, например. Я использую PGPASSWORD регулярно.
123
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
  • 0
    это работает и в terraform. ты, мой друг, спасатель
60

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

set PGPASSWORD=[your password]
  • 21
    в моем случае команда set не работала, но export PGPASSWORD=[password] работал
  • 7
    SET должен работать на Windows.
Показать ещё 2 комментария
42

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

Шаги:

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

Обратите внимание, что если у вас есть установленная переменная PGPASSWORD = '', она будет иметь приоритет над файлом. Также разумно изменить разрешения вашего файла, чтобы содержимое было скрыто от других пользователей. Этого можно достичь с помощью chmod 600 ~/.pgpass

  • 1
    Вы должны сделать chmod 600 для файла, иначе psql будет молча игнорировать его (согласно документации).
12

Вам нужно создать файл паролей: см. http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html для получения дополнительной информации.

11

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

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

export PGPASSWORD=[password]

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

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

  • 1
    export PGPASSWORD=[password] у меня вообще не работает с использованием командной строки (cmd.exe). Вы уверены, что не использовали Cygwin или что-то подобное?
  • 0
    Работает только с cl, вы добавили его в файл правильно? Теперь просто введите его в команду?
Показать ещё 2 комментария
6

Основываясь на могучем ответить тем, кто не устраивает скрипты * nix shell, здесь работает script:

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

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

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

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

psql mydb jdoe

Не забудьте сделать исполняемый файл script с

chmod +x runpsql (или все, что вы назвали файлом script)

  • 4
    Вы можете использовать mktemp для создания временного файла вместо того, чтобы придумывать собственную схему именования. Он создает новый временный файл (с именем что-то вроде /tmp/tmp.ITXUNYgiNh в Linux и /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4 на MacOS X) и печатает его имя в stdout.
  • 0
    Проблема безопасности Лучше всего делать chmod 600 после создания файла, но перед тем, как записать в него пароль. Как написано, вредоносный сценарий на сервере может постоянно пытаться читать файлы этого формата, и иногда ему удается получить пароль. Кроме того, если этот сценарий по какой-то причине прервется, файл останется на диске - запись обработчика trap оболочки решит эту проблему. Учитывая, что написать такой безопасный сценарий нетривиально, я рекомендую вместо этого использовать export PGPASSWORD .
6

Учитывая проблемы безопасности, связанные с использованием переменной среды 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
  • 0
    Рабочий пример такого подхода приведен в stackoverflow.com/a/40614592/3696363 - еще один ответ на этот вопрос.
  • 0
    Хотя этот пользователь на самом деле не просил то же самое, что я ищу, я бы сказал, что подход не совпадает. При использовании синтаксиса PGPASSFILE = <(что угодно) вы можете делать такие вещи, как дешифрование файла, и он должен присутствовать только в созданном дескрипторе файла. Записывая временный файл, вы принципиально не решаете проблему наличия файла на диске с учетными данными. Нелегко иметь дело с произвольными подобными правилами, но с этим сталкиваются многие.
4

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

PGPASSWORD=password psql -U myuser < myscript.sql

2
0

Как насчет использования полной строки и позволить psql разобрать ее?

0

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

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

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5433/mydb
  • 0
    Postrgres 9.3 игнорирует переменную окружения PGPASSWORD
0

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

-4

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

Ещё вопросы

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