如何更改PostgreSQL用户密码?

时间:2012-10-04 05:45:39

标签: postgresql change-password

如何更改PostgreSQL用户的密码?

20 个答案:

答案 0 :(得分:1090)

少密码登录:

sudo -u user_name psql db_name

如果忘记了,请重置密码:

ALTER USER user_name WITH PASSWORD 'new_password';

答案 1 :(得分:517)

然后输入:

$ sudo -u postgres psql

然后:

\password postgres

然后退出psql

\q

如果不起作用,请重新配置身份验证。

修改/etc/postgresql/9.1/main/pg_hba.conf(路径会有所不同)并更改:

    local   all             all                                     peer

为:

    local   all             all                                     md5

然后重启服务器:

$ sudo service postgresql restart

答案 2 :(得分:67)

您可以而且应该加密用户的密码:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';

答案 3 :(得分:34)

我认为更改密码的最佳方法就是使用:

\password

在Postgres控制台中。

来源:

  

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

来自https://www.postgresql.org/docs/9.0/static/sql-alterrole.html

答案 4 :(得分:29)

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

sudo -u <user_name> psql -c "ALTER USER <user_name> PASSWORD '<new_password>';"

答案 5 :(得分:20)

转到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

使用新密码。

如果你们都发现任何问题,请告诉我。

答案 6 :(得分:8)

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

local   all   all   trust

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

答案 7 :(得分:8)

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

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>;

答案 8 :(得分:7)

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

sudo -u postgres psql -c "\password"

答案 9 :(得分:5)

For my case on Ubuntu 14.04 installed with postgres 10.3. I need to follow the following steps

  • su - postgres to switch user to postgres
  • psql to enter postgres shell
  • \password then enter your password
  • \q to quit the shell session
  • Then you switch back to root by executing exit and configure your pg_hba.conf (mine is at /etc/postgresql/10/main/pg_hba.conf) by making sure you have the following line

    local all postgres md5

  • Restart your postgres service by service postgresql restart
  • Now switch to postgres user and enter postgres shell again. It will prompt you with password.

答案 10 :(得分:5)

如果您在Windows上。

打开pg_hba.conf文件,然后从md5更改为peer

打开cmd,输入psql postgres postgres

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

Refer to this medium post了解更多信息和详细步骤。

答案 11 :(得分:5)

TLDR:

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

Example:

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

比例:

Postgres对于何时使用“双引号”以及何时使用“单引号”非常挑剔。通常,在提供字符串时,将使用单引号。

答案 12 :(得分:3)

类似于语法上的其他答案,但是应该知道,您还可以传递密码的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仍支持回溯。)
  • create role
  •   

    密码始终以加密方式存储在系统目录中。 ENCRYPTED关键字无效,但是为了向后兼容而被接受。加密方法由配置参数password_encryption确定。如果显示的密码字符串已经采用MD5加密或SCRAM加密的格式,则无论password_encryption如何都将按原样存储(因为系统无法解密指定的加密密码字符串,因此无法以其他格式对其进行加密)。这样可以在转储/还原过程中重新加载加密的密码。

  • password_encryption的配置设置
  • postgres password authentication doc
  • building postgres password md5

答案 13 :(得分:3)

更改密码

 sudo -u postgres psql

然后

\password postgres

现在输入新密码并确认

然后\q退出

答案 14 :(得分:2)

使用它:

\password

输入您希望该用户使用的新密码,然后进行确认。 如果您不记得密码并想要更改密码,则可以以postgres身份登录,然后使用:

ALTER USER 'the username' WITH PASSWORD 'the new password';

答案 15 :(得分:1)

检查pg_hba.conf

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

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

答案 16 :(得分:1)

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

  1. pg_hba.conf 备份到 pg_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. 从上面的 1. 恢复 pg_hba.conf

答案 17 :(得分: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 特殊命令更改密码。
  • 记得删除密码忽略解决方法并重新启动服务器以应用配置。

答案 18 :(得分:0)

以及使用bash和Expect的全自动方式(in this example我们在操作系统和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 ;
 "

答案 19 :(得分:0)

通常,只需使用pg admin UI进行数据库相关活动即可。

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

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

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

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

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

(b)通过运行NON-Interactive SQL命令为该用户提供一些密码。

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

Postgres可能是用于命令行(非交互式)工具的最佳数据库。 创建用户,运行SQL,备份数据库等... 通常,对于postgres来说,这都是非常基本的,将其集成到开发设置脚本或自动CI配置中总体来说是微不足道的。