Postgresql: сценарий выполнения psql с паролем - PullRequest
246 голосов
/ 29 июня 2011

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

Вот что у меня есть:

psql -Umyuser < myscript.sql

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

Ответы [ 13 ]

280 голосов
/ 29 июня 2011

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

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

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

PGPASSWORD=yourpass psql ...
149 голосов
/ 04 декабря 2013
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
65 голосов
/ 19 сентября 2011

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

set PGPASSWORD=[your password]
46 голосов
/ 13 января 2015

Если вы намереваетесь использовать несколько хостов / соединений с базой данных, файл ~ / .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. Введите псевдоним из командной строки.

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

19 голосов
/ 02 ноября 2018

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

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

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
12 голосов
/ 27 марта 2014

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

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

export PGPASSWORD=[password]

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

Конечно, работает на windows:)

12 голосов
/ 29 июня 2011

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

6 голосов
/ 19 января 2018

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

PGPASSWORD=password psql -U myuser < myscript.sql

6 голосов
/ 05 декабря 2014

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

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

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

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

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

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

WARNING: password file "/dev/fd/63" is not a plain file
5 голосов
/ 15 ноября 2016

Построение ответа mightybyte для тех, кто не знаком с * nix сценариями оболочки, вот рабочий сценарий:

#!/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 , также есть разрешения ""ошибка, если этого не сделать.

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

psql mydb jdoe

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

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

UPDATE:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...