如何从 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
以上两个答案都有效。
我有一个从虚拟环境运行的 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
以上两个答案都有效。