如何更改PostgreSQL用户的密码?


当前回答

以及Bash和expect的完全自动化方式(在本例中,我们在OS和PostgreSQL运行时级别为新的PostgreSQL管理员提供新设置的PostgreQL密码):

  # The $postgres_usr_pw and the other Bash variables 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' executable 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 ;
 "

其他回答

这在语法上类似于其他答案,但应该知道,您也可以传递密码的MD5哈希值,因此您不会发送纯文本密码。

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

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

话虽如此,以下是我们如何通过构建密码的MD5哈希值来更改用户的密码。

PostgreSQL在将密码散列为MD5时,会将密码与用户名相加,然后在得到的散列前加上文本“MD5”。示例:“md5”+md5(密码+用户名)巴什语:echo-n“passwordStringUserName”|md5sum|awk“{print”md5“$1}”输出:md5d6a35858d61d85a82ab1fb044aba9日在PowerShell中:[PSCredential]$Credential=获取凭据$StringBuilder=新对象System.Text.StringBuilder$null=$StringBuilder.Append('md5');[System.Security.Cryptography.HashAlgorithm]::Create('md5').ComputerHash([System.Text.Encoding]::ASCII.GetBytes(((从SecureStringToPlainText转换为SecureString$Credential.Password)+$Credential.UserName)))| For每个对象{$null=$StringBuilder.Append($_.ToString(“x2”))}$StringBuilder.ToString();##输出,输出md5d6a35858d61d85a82ab1fb044aba9日最后,ALTERUSER命令将如下所示使用密码“md5d6a35858d61d85e4a82ab1fb044aba9d”更改用户用户名;相关链接(请注意,我只会链接到文档的最新版本。对于旧版本,它会有一些变化,但MD5仍然支持。)创建角色密码始终以加密方式存储在系统目录中。ENCRYPTED关键字无效,但为向后兼容而被接受。加密方法由配置参数password_encryption确定。如果呈现的密码字符串已采用MD5加密或SCRAM加密格式,则无论password_encrypt如何,都会按原样存储(因为系统无法解密指定的加密密码字符串,所以请使用不同的格式对其进行加密)。这允许在转储/还原期间重新加载加密密码。密码加密的配置设置PostgreSQL密码验证文档构建PostgreSQL密码MD5哈希值

要在没有密码的情况下登录,请执行以下操作:

sudo -u user_name psql db_name

如果您忘记了重置密码:

ALTER USER user_name WITH PASSWORD 'new_password';

将用户“postgres”的密码更改为“postgress”:

# ALTER USER postgres WITH ENCRYPTED PASSWORD '<NEW-PASSWORD>';

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

to:

Database administrative login by Unix domain socket
local   all             postgres                                peer

然后通过“sudo”命令重新启动PostgreSQL服务。然后

psql-U postgres

现在您将进入并看到PostgreSQL终端。

然后输入

\密码

并为PostgreSQL默认用户输入新密码。再次成功更改密码后,转到pg_hba.conf并将更改还原为“md5”。

现在您将以身份登录

psql -U postgres

使用新密码。

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

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