如何从 bash 测试 postgresql 凭据?

How to test postgresql credentials from bash?

我有一个从虚拟环境运行的 Django 应用程序。我正在编写一个 bash 脚本来测试虚拟环境。 postgresql用户名和密码是虚拟环境中的环境变量,Django拉入settings.py.

为了测试与数据库的连接,我写了以下内容:

echo -n 'Testing database connection  ...'

export COMMAND="from psycopg2 import connect; import sys; c=connect(dbname='myappdb',\ 
user='$POSTGRESQL_USER', password='$POSTGRESQL_PWD', host='127.0.0.1', port=5432); \
sys.exit(c.closed)"

test `python -c "$COMMAND" 2>/dev/null && echo true `

其中 test 是一个函数:

function test {
  [  ] && echo "[OK]" || echo "[FAIL]"
}

似乎即使凭据错误,也不会引发异常,并且 c.closed 始终为零。有什么方法可以测试凭据在虚拟环境中是否正确?

是 bash,不是 python,所以不确定它是否符合您的需要:

vao@vao-X102BA:~$ psql -d "postgresql://p:goodpassword@localhost/t" -c "select now()"
              now
-------------------------------
 2017-07-14 11:42:40.712981+03
(1 row)

vao@vao-X102BA:~$ echo $?
0
vao@vao-X102BA:~$ psql -d "postgresql://p:badpassword@localhost/t" -c "select now()"
psql: FATAL:  password authentication failed for user "p"
FATAL:  password authentication failed for user "p"
vao@vao-X102BA:~$ echo $?
2

如果你想抑制输出,而不是 select now(),你可以用 -c "\q"

退出

您的机器上没有 psql 吗?使用命令应用程序比 python 做你想做的事更简单。

if PGHOST=127.0.0.1 PGPORT=5432 PGUSER=$POSTGRESQL_USER PGPASSWORD=$POSTGRESQL_PWD \
        PGDATABASE=myappdb psql -c \q 2>/dev/null
then
    echo "[OK]"
else
    echo "[FAIL]"
fi

PGHOST=127.0.0.1 ... 正在临时将变量导出到 psql\q 只是告诉客户端如果连接成功就立即退出。

原来正在使用的pg_hba.conf文件是:

local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

我改成了:

local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

以上两个答案都有效。