1387

如何更改 PostgreSQL 用户的密码?

4

22 回答 22

1975

要不使用密码登录:

sudo -u user_name psql db_name

忘记密码时重置密码:

ALTER USER user_name WITH PASSWORD 'new_password';
于 2012-10-04T05:55:58.537 回答
872

要更改 postgres 用户的密码,请按照以下步骤操作

  1. 登录到 psql:
$ sudo -u postgres psql
  1. 然后在 psql 控制台中更改密码并退出:
postgres=# \password postgres
Enter new password: <new-password>
postgres=# \q

或使用查询

ALTER USER postgres PASSWORD '<new-password>';

或在一行中

sudo -u postgres psql -c "ALTER USER postgres PASSWORD '<new-password>';"

笔记:

如果这不起作用,请通过编辑重新配置身份验证/etc/postgresql/9.1/main/pg_hba.conf(路径将不同)并更改:

local   all         all                  peer # change this to md5

## to

local   all         all                  md5 # like this

然后重启服务器:

$ sudo service postgresql restart
于 2012-10-04T05:50:02.383 回答
121

您可以并且应该对用户的密码进行加密:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';
于 2015-02-21T08:58:59.467 回答
98

我相信更改密码的最佳方法是简单地使用:

\password

在 Postgres 控制台中。

根据ALTER USER 文档

使用此命令指定未加密的密码时必须小心。密码将以明文形式传输到服务器,也可能会记录在客户端的命令历史记录或服务器日志中。psql 包含一个命令 \password ,可用于更改角色的密码而不暴露明文密码。

注意:ALTER USER是一个别名ALTER ROLE

于 2017-08-30T16:55:11.180 回答
50

要使用 Linux 命令行更改密码,请使用:

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"
于 2015-05-25T23:14:13.743 回答
43

更改密码

 sudo -u postgres psql

然后

\password postgres

现在输入新密码并确认

然后\q退出

于 2019-06-29T19:09:52.093 回答
32

转到您的 Postgresql 配置并编辑 pg_hba.conf

sudo vim /etc/postgresql/9.3/main/pg_hba.conf

然后更改此行:

Database administrative login by Unix domain socket
local      all              postgres                                md5

到 :

Database administrative login by Unix domain socket
local   all             postgres                                peer

然后通过 SUDO 命令重启 PostgreSQL 服务然后

psql -U postgres

您现在将进入并看到 Postgresql 终端

然后输入

\password

并输入 Postgres 默认用户的新密码,再次成功更改密码后转到 pg_hba.conf 并将更改恢复为“md5”

现在您将登录为

psql -U postgres

使用您的新密码。

如果大家发现其中有任何问题,请告诉我。

于 2014-10-09T14:03:55.170 回答
15

postgres用户请求新密码(不在命令中显示):

sudo -u postgres psql -c "\password"
于 2018-03-03T04:05:11.513 回答
14

这是谷歌上的第一个结果,当时我正在寻找如何重命名用户,所以:

ALTER USER <username> WITH PASSWORD '<new_password>';  -- change password
ALTER USER <old_username> RENAME TO <new_username>;    -- rename user

其他一些有助于用户管理的命令:

CREATE USER <username> PASSWORD '<password>' IN GROUP <group>;
DROP USER <username>;

将用户移动到另一个组

ALTER GROUP <old_group> DROP USER <username>;
ALTER GROUP <new_group> ADD USER <username>;
于 2016-04-21T20:53:44.477 回答
13

如果你在窗户上。

打开pg_hba.conf文件并从 更改md5peer

打开cmd,输入psql postgres postgres

然后键入\password以提示输入新密码。

有关更多信息和详细步骤,请参阅此中等帖子

于 2020-06-13T19:27:39.547 回答
10

我在服务器上的配置进行了很多定制,只有在文件中设置了信任身份验证后,我才设法更改密码:pg_hba.conf

local   all   all   trust

不要忘记将其改回密码或 md5

于 2014-01-11T20:39:33.507 回答
9

对于我在安装了 postgres 10.3 的 Ubuntu 14.04 上的情况。我需要按照以下步骤

  • su - postgres将用户切换到postgres
  • psql进入 postgres 外壳
  • \password然后输入你的密码
  • \q退出 shell 会话
  • exit然后你通过执行和配置你的pg_hba.conf(我的在)切换回root,/etc/postgresql/10/main/pg_hba.conf确保你有以下行

    local all postgres md5

  • 通过以下方式重新启动您的 postgres 服务service postgresql restart
  • 现在切换到postgres用户并再次进入 postgres shell。它会提示您输入密码。
于 2018-03-25T19:47:25.657 回答
8

用这个:

\password

输入该用户所需的新密码,然后确认。如果您不记得密码并且想要更改它,您可以使用 postgres 登录,然后使用:

ALTER USER 'the username' WITH PASSWORD 'the new password';
于 2018-02-12T11:52:14.847 回答
6

TLDR:

在许多系统上,用户的帐户通常包含句点或某种标点符号(用户:john.smith、horise.johnson)。在这些情况下,必须对上面接受的答案进行修改。更改要求用户名被双引号引起来。

Example:

ALTER USER "username.lastname" WITH PASSWORD 'password'; 

合理的:

Postgres 对何时使用“双引号”和何时使用“单引号”非常挑剔。通常在提供字符串时,您会使用单引号。

于 2020-06-01T18:28:49.937 回答
6

为 Postgres 角色设置密码

$ sudo -u postgres psql

你会得到如下的东西:

postgres=#

将用户 Postgres 的密码更改为 Postgres

# ALTER USER postgres WITH ENCRYPTED PASSWORD 'postgres';

你会得到如下的东西:

ALTER ROLE
postgres=#

为此,我们需要编辑 pg_hba.conf 文件。

=====> 随意用您选择的编辑器替换 nano

$ sudo nano /etc/postgresql/9.5/main/pg_hba.conf

在 pg_hba.conf 中更新

查找具有如下所示内容的未注释行(不以 # 开头的行)。间距会略有不同,但字应该是一样的。

        local   postgres   postgres   peer
        
    to

        local   postgres   postgres   md5
    

现在我们需要重新启动 Postgres 以使更改生效。

$ sudo service postgresql restart
于 2021-10-30T10:05:21.650 回答
5

将用户 postgres 的密码更改为 postgres

# ALTER USER postgres WITH ENCRYPTED PASSWORD '<NEW-PASSWORD>';
于 2021-10-30T10:34:19.940 回答
4

与语法上的其他答案类似,但应该知道您也可以传递密码的 md5,因此您不会传输纯文本密码。

以下是一些以纯文本形式更改用户密码的意外后果。

  1. 如果您没有 SSL 并且正在远程修改,则您正在通过网络传输纯文本密码。
  2. 如果您将日志配置设置为记录 DDL 语句log_statement = ddl或更高版本,那么您的纯文本密码将显示在错误日志中。
    1. 如果您不保护这些日志,那将是一个问题。
    2. 如果您收集这些日志/ETL 并将它们显示在其他人可以访问的位置,他们最终可能会看到此密码等。
    3. 如果您允许用户管理他们的密码,他们会在不知不觉中将密码泄露给负责查看日志的管理员或低级别员工。

话虽如此,这里是我们如何通过构建密码的 md5 来更改用户的密码。

  • Postgres 将密码哈希为 md5 时,使用用户名对密码进行加盐,然后将文本“md5”添加到生成的哈希中。
  • 例如:“md5”+md5(密码+用户名)

  • 在 bash 中:

    ~$ echo -n "passwordStringUserName" | md5sum | awk '{print "md5"$1}'
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • 在 PowerShell 中:
    [PSCredential] $Credential = Get-Credential

    $StringBuilder = New-Object System.Text.StringBuilder

    $null = $StringBuilder.Append('md5');

    [System.Security.Cryptography.HashAlgorithm]::Create('md5').ComputeHash([System.Text.Encoding]::ASCII.GetBytes(((ConvertFrom-SecureStringToPlainText -SecureString $Credential.Password) + $Credential.UserName))) | ForEach-Object {
        $null = $StringBuilder.Append($_.ToString("x2"))
    }

    $StringBuilder.ToString();

    ## OUTPUT
    md5d6a35858d61d85e4a82ab1fb044aba9d
  • 所以最后我们的ALTER USER命令看起来像
    ALTER USER UserName WITH PASSWORD 'md5d6a35858d61d85e4a82ab1fb044aba9d';
  • 相关链接(请注意,我只会链接到最新版本的文档,因为它会更改一些旧版本,但 md5 仍然支持返回方式。)
  • 创建角色
  • 密码始终加密存储在系统目录中。ENCRYPTED 关键字没有效果,但为了向后兼容而被接受。加密方法由配置参数 password_encryption 决定。如果显示的密码字符串已经是 MD5 加密或 SCRAM 加密的格式,那么无论 password_encryption 是什么,它都按原样存储(因为系统无法解密指定的加密密码字符串,因此以不同的格式对其进行加密)。这允许在转储/恢复期间重新加载加密密码。

  • password_encryption的配置设置
  • postgres 密码认证文档
  • 构建postgres密码md5
于 2019-08-20T19:52:46.240 回答
4

以及使用 bash 和 expect 的全自动方式(在此示例中,我们在 OS 和 postgres 运行时级别上使用新配置的 postgres pw 配置新的 postgres 管理员)

  # the $postgres_usr_pw and the other bash vars MUST be defined 
  # for reference the manual way of doing things automated with expect bellow
  #echo "copy-paste: $postgres_usr_pw"
  #sudo -u postgres psql -c "\password"
  # the OS password could / should be different
  sudo -u root echo "postgres:$postgres_usr_pw" | sudo chpasswd

  expect <<- EOF_EXPECT
     set timeout -1
     spawn sudo -u postgres psql -c "\\\password"
     expect "Enter new password: "
     send -- "$postgres_usr_pw\r"
     expect "Enter it again: "
     send -- "$postgres_usr_pw\r"
     expect eof
EOF_EXPECT

  cd /tmp/
  # at this point the postgres uses the new password
  sudo -u postgres PGPASSWORD=$postgres_usr_pw psql \
    --port $postgres_db_port --host $postgres_db_host -c "
  DO \$\$DECLARE r record;
     BEGIN
        IF NOT EXISTS (
           SELECT
           FROM   pg_catalog.pg_roles
           WHERE  rolname = '"$postgres_db_useradmin"') THEN
              CREATE ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
              CREATEDB REPLICATION BYPASSRLS 
 PASSWORD '"$postgres_db_useradmin_pw"' LOGIN ;
        END IF;
     END\$\$;
  ALTER ROLE "$postgres_db_useradmin" WITH SUPERUSER CREATEROLE
  CREATEDB REPLICATION BYPASSRLS 
PASSWORD  '"$postgres_db_useradmin_pw"' LOGIN ;
 "
于 2019-10-20T08:35:27.377 回答
2

一般来说,只需使用 pg admin UI 来执行 db 相关活动。

相反,如果您更专注于为本地开发或 CI 等自动化数据库设置...

例如,您可以使用这样的简单组合。

(a) 通过 jenkins 创建一个虚拟超级用户,命令类似于:

docker exec -t postgres11-instance1 createuser --username=postgres --superuser experiment001

这将在您的 postgres 数据库中创建一个名为 Experiment001 的超级用户。

(b) 通过运行非交互式 SQL 命令给这个用户一些密码。

docker exec -t postgres11-instance1 psql -U experiment001 -d postgres -c "ALTER USER experiment001 WITH PASSWORD 'experiment001' "

Postgres 可能是用于命令行(非交互式)工具的最佳数据库。创建用户、运行 SQL、备份数据库等...一般来说,使用 postgres 都是非常基础的,将其集成到您的开发设置脚本或自动化 CI 配置中总体上非常简单。

于 2019-11-01T17:41:14.930 回答
2

我使用的是 Windows(Server 2019;PG 10),因此不支持local类型连接(pg_hba.conf:) 。local all all peer以下应该适用于 Windows 和 Unix 系统:

  1. 备份pg_hba.confpg_hba.orig.conf例如
  2. 仅使用以下内容创建pg_hba.confhost all all 127.0.0.1/32 trust
  3. 重启 pg(服务)
  4. 执行psql -U postgres -h 127.0.0.1
  5. 输入(在 pgctl 控制台中)alter user postgres with password 'SomePass';
  6. pg_hba.conf从 1. 以上恢复
于 2021-03-05T13:46:59.153 回答
1

检查 pg_hba.conf

如果身份验证方法是“对等”,则客户端的操作系统用户名/密码必须与数据库用户名和密码匹配。在这种情况下,请将 Linux 用户“postgres”和数据库用户“postgres”的密码设置为相同。

有关详细信息,请参阅文档:https ://www.postgresql.org/docs/9.1/auth-pg-hba-conf.html

于 2020-10-02T17:30:10.997 回答
1

大多数答案大多是正确的,但你需要注意一些小问题。我遇到的问题是我从未设置过 postgres 的密码,所以我无法登录允许我更改密码的 SQL 命令行。这些是我成功使用的步骤(请注意,大多数或所有命令都需要 sudo/root 用户):

  • pg_hba.conf在您尝试连接的数据库集群的数据目录中 编辑。
    • 通过查看 systemd 命令行可以找到数据目录的文件夹,使用systemctl status postgresql@VERSION-DB_CLUSTER. 将 VERSION 替换为您的 PSQL 版本,将 DB_CLUSTER 替换为您的数据库集群的名称。如果它是自动创建的,这可能是主要的,例如。postgresql@13-main. 或者,我的 bash 在输入后提供了自动完成功能postgresql@,因此您可以尝试这样做或在所有服务列表 ( systemctl -a) 中查找 postgresql 服务。获得状态输出后,查找 CGroup 之后的第二个命令行,该命令行应该相当长,并以/usr/lib/postgresql/13/bin/postgres或类似开头(取决于版本、发行版和安装方法)。-D例如,您正在寻找之后的目录/var/lib/postgresql/13/main
  • 添加以下行:host all all 127.0.0.1/32 trust. 这允许所有数据库上的所有用户无条件地通过本地机器上的 IPv4 连接到数据库,而无需输入密码。这是一个临时修复,不要忘记稍后再次删除此行。为了确定,我注释掉了host all all 127.0.0.1/32 md5(md5可能被scram-sha-256替换),它对相同的登录数据有效,只需要密码。
  • 重新启动数据库服务:systemctl restart postgresql@...再次使用您之前找到的确切服务。
  • 检查服务是否正确启动systemctl status postgresql@...
  • 与 psql 连接,非常重要的是,强制 psql 不要求输入密码。根据我的经验,即使服务器不在乎,它也会要求您输入密码,并且如果您的密码错误,它仍然会拒绝您的登录。这可以通过-w标志来完成。完整的命令行如下所示:sudo -u postgres psql -w -h 127.0.0.1 -p 5432. 在这里,postgres是您的用户,您可能已经改变了它。5432是特定于集群的服务器的端口,如果您运行多个集群(例如我有 5434),可能会更高。
  • \password使用特殊命令更改密码。
  • 请记住删除密码忽略解决方法并重新启动服务器以应用配置。
于 2021-04-13T09:05:17.353 回答