PostgreSQL:如何更改PostgreSQL用户密码?


Answers:


1402

对于少密码登录:

sudo -u user_name psql db_name

要忘记密码,请重设密码:

ALTER USER user_name WITH PASSWORD 'new_password';

126
这样可以在用户的​​postgresql命令历史记录中清除密码。
greg 2012年

118
@greg:将其删除:rm ~/.psql_history
RickyA 2013年

43
离题,但如果有人正在寻找“如何更改用户名”而不是ALTER USER myuser RENAME TO newname;...出于某种原因,谷歌在我进行谷歌搜索时将我指给我:)
等效

10
为什么要同时使用“和”引号?我的意思是,这是有区别的,在DML查询中,在处理字符串时必须使用“,但是在这里使用它们都需要特殊的理由吗?
Boyan

7
用户是一个对象,而不是字符串。与ALTER TABLE“ table_name”或什至SELECT * FROM“ table_name”进行比较。您不能在这些上下文中对表使用单引号,对用户/角色也是如此。
P Daddy

630

然后输入:

$ 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

3
postgres的默认密码是多少?意外更改;可以重置?
2012年

2
(在psql 9.2上)如果输入\p,它会给我密码;如果我输入\password postgres密码,则输入密码,然后发出警告\p extra argument "assword" ignored; \p extra argument "postgres" ignored
David LeBauer 2013年

1
这比在SQL命令历史记录中保留密码要好得多。
otocan '19

1
@ZacharyScott你在说什么?
TheRealChx101 '19

2
要在Linux中更改postgres用户的密码:sudo passwd postgres
Punnerud

88

您可以并且应该已经加密了用户的密码:

ALTER USER username WITH ENCRYPTED PASSWORD 'password';

45
此关键字与当前版本无关。摘自postgresql.org/docs/current/static/sql-createrole.html The password is always stored encrypted in the system catalogs. The ENCRYPTED keyword has no effect, but is accepted for backwards compatibility.
John29,2017年

5
谨防!@ John29注释仅适用于Postgresql 10及更高版本。对于所有其他版本,已加密标志很重要。
菲普

51

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

\password

在Postgres控制台中。

资源:

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

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


8
这也可以用来更改其他用户的密码:\password username
Martin



24

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

用您的新密码。

让我知道您是否在其中找到任何问题。


它不起作用:user@user-NC10:~$ psql -U postgres psql: FATAL: Peer authentication failed for user "postgres"
GM

好的,执行另一种方法sudo su-postgres psql您将输入终端,然后在此处更改密码,这是另一种方法。让我知道这是否对您
有用

毫米-我已经尝试过,但是我有另一个错误:/ usr / bin / psql:第19行:使用:找不到命令/ usr / bin / psql:第21行:使用:找不到命令/ usr / bin / psql:第23行:使用:找不到命令/ usr / bin / psql:第24行:使用:找不到命令/ usr / bin / psql:psql:第26行:意外令牌附近的语法错误$version,' /usr/bin/psql: psql: line 26: my($ version,$ cluster,$ db,$ port ,$ host);' 谢谢你的帮助!
GM

11

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

sudo -u postgres psql -c "\password"

9

我在服务器上获得的配置已大量自定义,并且只有在文件中设置了信任身份验证后,我才设法更改了密码:pg_hba.conf

local   all   all   trust

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


1
您还需要重新启动postgres服务以使更改生效sudo systemctl restart postgresql.service
Sampath Surineni

这个pg_hba.conf文件应该去哪里?
JMStudios.jrichardson

8

这是Google在寻找如何重命名用户时的第一个结果,因此:

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

7

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

  • su - postgres 切换到 postgres
  • psql 进入postgres shell
  • \password 然后输入您的密码
  • \q 退出shell会话
  • 然后,通过执行以下命令exit并配置您的pg_hba.conf(我的位置为/etc/postgresql/10/main/pg_hba.conf),切换回root用户:

    local all postgres md5

  • 重新启动您的postgres服务 service postgresql restart
  • 现在切换到postgres用户并再次输入postgres shell。它将提示您输入密码。

我认为您确实不需要在更改密码后重新启动postgresql服务。我已经能够通过重启密码来重置密码。\ password是最快的方法。否则,您需要ALTER USER命令。
Archit Kapoor

3

用这个:

\password

输入该用户想要的新密码,然后确认。如果您忘记了密码并且想要更改密码,可以以postgres身份登录,然后使用以下密码:

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

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仍支持回溯。)
  • 创建角色
  • 密码始终以加密方式存储在系统目录中。ENCRYPTED关键字无效,但是为了向后兼容而被接受。加密方法由配置参数password_encryption确定。如果显示的密码字符串已经采用MD5加密或SCRAM加密的格式,则无论password_encryption如何都将按原样存储(因为系统无法解密指定的加密密码字符串,因此无法以其他格式对其进行加密)。这允许在转储/还原期间重新加载加密的密码。

  • password_encryption的配置设置
  • postgres密码验证文档
  • 建立postgres密码md5

1

通常,只需使用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配置中总体来说是微不足道的。


1

以及使用bash和Expect的全自动方式(在此示例中,我们在操作系统和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 ;
 "

0

TLDR:

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

Example:

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

合理的:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.