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

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

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

psql -Umyuser < myscript.sql

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

+221
29 июн. '11 в 15:16
источник поделиться
14 ответов

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

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

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

PGPASSWORD=yourpass psql ...
+245
29 июн. '11 в 16:39
источник
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
+129
04 дек. '13 в 7:48
источник

Связанные вопросы


Похожие вопросы

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

set PGPASSWORD=[your password]
+58
19 сент. '11 в 16:19
источник

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

Шаги:

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

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

+40
13 янв. '15 в 17:38
источник

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

+12
29 июн. '11 в 15:24
источник

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

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

export PGPASSWORD=[password]

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

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

+11
27 мар. '14 в 16:21
источник

Учитывая проблемы безопасности, связанные с использованием переменной среды 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
+6
05 дек. '14 в 17:36
источник

Основываясь на могучем ответить тем, кто не устраивает скрипты * 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)

+6
15 нояб. '16 в 16:11
источник

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

PGPASSWORD=password psql -U myuser < myscript.sql

+4
19 янв. '18 в 6:53
источник

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

0
12 дек. '18 в 16:35
источник

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

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

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5433/mydb
0
02 нояб. '18 в 13:25
источник

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

-1
20 июл. '17 в 9:12
источник

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

-5
22 дек. '16 в 17:43
источник

Посмотрите другие вопросы по меткам или Задайте вопрос