为什么psql能无密码登录

为什么psql能无密码登录

在首次使用pgsql时, 需要修改postgres账号的密码, 发现一个奇怪的事情
使用 sudo -u postgres psql -h 127.0.0.1 需要输入密码,
使用 sudo -u postgres psql 无需输入密码,

为何多加了一个host参数就不一样?

难道使用psql命令不带任何参数时, host不是默认为127.0.0.1(或localhost)?
psql命令不带任何参数时, 又是如何忽略密码的?

连接参数
sudo -u postgres psql -U postgres -d postgres -h 127.0.0.1 -p 5432
简写为
sudo -u postgres psql -h 127.0.0.1 

PostgreSQL客户端认证配置文件:
/etc/postgresql/9.5/main/pg_hba.conf

经过查看postgresql的配置文件, 得到以下信息

# The first field is the connection type: "local" is a Unix-domain
# socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
# plain TCP/IP socket.
# 第一个字段是连接类型:
# "local"是一个 Unix-domain socket,
# "host"是一个普通或ssl加密的 TCP/IP socket,
# "hostssl"是一个ssl加密的 TCP/IP socket,
# "hostnossl"是一个普通 TCP/IP socket.

注: "local" is a Unix-domain socket
...

# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "ident", "peer", "pam", "ldap", "radius" or "cert".  Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.

注: METHOD can be "peer" (Peer Authentication 对等身份验证)
...

# DO NOT DISABLE!
# 不要禁用!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
# 如果你更改了第一个条目,你需要确保数据库超级用户可以使用其他方法访问数据库.
# 在自动维护期间需要对所有数据库进行非交互式访问(自定义的日常计划任务、复制和类似任务)
#
# Database administrative login by Unix domain socket
# 数据库管理员通过 Unix domain socket 登录
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
# "local" 只能通过 Unix domain socket 连接
local   all             all                                     peer

注: local 是没有ADDRESS参数的

这里有两个关键点:

一是local 没有ADDRESS参数
带上host参数, 就是使用host配置.
不带host参数, 就是使用local配置.

二是 Unix domain socket的连接方式peer的验证方式
关于peer可以查看官网的Peer Authentication说明,
只有当Linux用户名与数据库用户名一致时才能访问.

你可能感兴趣的:(PostgreSQL)