我已经打开了一个 SSH 隧道来连接到远程服务器,如下所示:
$ ssh -f -N -L 5433:127.0.0.1:5432 username@servername
这条隧道已精确开通如下(如 所示ps aux | grep ssh
):
ssh -f -N -L 5433:127.0.0.1:5432 username@servername
我确实有一个~/.pg_service.conf
:
[my-pg-service]
host=127.0.0.1
port=5433
dbname=mydatabase
user=pguser
# just append the .pgpass file here:
[my-pg-service-2]
host=127.0.0.1
port=5433
dbname=mydatabase
user=pguser
passfile=~/.pgpass
运行时:
$ psql service=my-pg-service
它目前(并且令人惊讶地)无需询问数据库密码即可连接!(可能它存储在某种缓存中,因为我在该命令之前已经使用过它?)
但是在使用时psql service=my-pg-service-2
它实际上要求输入数据库密码。
我希望它会以相反的方式表现!
我的~/.pgpass
( chmod 0600
) 文件如下所示:
#hostname:port:database:username:password
# Remote pg database on server servername when using an SSH tunnel (5433)
127.0.0.1:5433:mydatabase:pguser:8+k3&4d2ihs1=&gp!*y)62xoh+^^z$&*ino!66jj()(yw@o36
请注意,此命令还要求输入数据库密码:
$ psql -d postgres://pguser@localhost:5433/mydatabase
但这不是:
$ psql -d postgres://[email protected]:5433/mydatabase
(我只更改localhost
为127.0.0.1
)。
这正是因为文件中没有以开头localhost
的行.pgpass
:
localhost:5433:mydatabase:pguser:8+k3&4d2ihs1=&gp!*y)62xoh+^^z$&*ino!66jj()(yw@o36
如果我添加此行,psql
则在前面两种情况下都无需提示输入密码即可连接,但我仍然遇到 pg 服务的问题,例如,当指定passfile=~/.pgpass
它时要求输入密码,而当没有时,它不会。
有人可以解释这种行为以及我做错了什么吗?
这可能与过于宽泛的服务器端配置有关吗?
以防万一,数据库在远程服务器上被 dockerized。它使用了官方的 postgis docker 镜像( 13:3.2
),它呈现了这些默认特性:
$ docker run \
--rm \
--name postgis \
-e POSTGRES_DB=postgres \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=changeme \
-d postgis/postgis:13-3.2
$ docker exec -it postgis bash -c "tail -n 21 /var/lib/postgresql/data/pg_hba.conf"
# CAUTION: Configuring the system for local "trust" authentication
# allows any local user to connect as any PostgreSQL user, including
# the database superuser. If you do not trust all your local users,
# use another authentication method.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
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
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host all all all md5
操作系统:Ubuntu 21.10
PG:14
文档:
https ://www.postgresql.org/docs/14/libpq-pgservice.html
https://www.postgresql.org/docs/14/libpq-connect.html#LIBPQ-PARAMKEYWORDS
https://www。 postgresql.org/docs/14/libpq-pgpass.html
这很容易解释。
如果您不指定
passfile
,则密码取自.pgpass
您的主目录,因此不会提示您输入密码。如果您指定
passfile=~/.pgpass
,则 PostgreSQL 无法找到该文件,因为它不理解波浪号(这是一个 shell 功能,并且您没有使用 shell),因此它会提示您输入密码。服务文件不理解波浪号来表示您的主目录。它将它作为文件名中的文字字符。所以那个文件不存在,你基本上取消了那个文件。(出于某种原因,没有警告)。