在本文中,我们将展示如何在不需要密码的情况下切换到另一个或特定的用户账户。例如,我们有一个名为postgres的用户账户(默认的PostgreSQL超级用户系统账户),我们希望在名为postgres的组中的每个用户(通常是我们的PostgreSQL数据库和系统管理员)使用su命令切换到postgres账户,而无需输入密码。
默认情况下,只有root用户可以在不输入密码的情况下切换到另一个用户账户。任何其他用户都会被提示输入他们要切换到的用户账户的密码(如果他们使用的是sudo命令,则会被提示输入他们的密码),如果他们没有提供正确的密码,他们会得到一个"authentication failed"认证失败的错误提示。
您可以使用下面提供的两种解决方案中的任何一种来解决上述问题。
1.使用PAM身份验证模块
PAM(可插入身份验证模块)是现代Linux操作系统上用户身份验证的核心。为了允许特定组中的用户无需密码即可切换到另一个用户帐户,我们可以在/etc/pam.d/su文件中修改su命令的默认PAM设置。
#vim /etc/pam.d/su
或
$ sudo vim /etc/pam.d/su
在 "auth sufficient pam_rootok.so "后添加以下配置,如下所示。
auth [success=ignore default=1] pam_succeed_if.so user = postgres
auth sufficient pam_succeed_if.so use_uid user ingroup postgres
在上述配置中,第一行检查目标用户是否为postgres,如果是,则服务检查当前用户,否则,default=1跳过该行并执行正常的身份验证步骤。
auth [success=ignore default=1] pam_succeed_if.so user = postgres
下来的一行检查当前用户是否在postgres组中,如果是,则认为认证过程成功,并返回足够的结果。否则,将执行正常的认证步骤。
auth sufficient pam_succeed_if.so use_uid user ingroup postgres
保存文件并关闭它。
接下来,使用usermod命令将您想要的用户(例如aaronk)添加su到postgres帐户中,而无需输入密码到gr
oup postgres中。
$sudo usermod -aG postgres aaronk
现在尝试以aaronk用户身份登录su到postgres帐户,不应该提示您输入密码,如以下屏幕截图所示:
$ su - postgres
2.使用Sudoers文件
你也可以通过在sudoers文件中做一些修改,在不需要密码的情况下su到另一个用户。在这种情况下,将切换到另一个用户帐户(例如postgres)的用户(例如aronk)应该在sudoers文件或sudo组中,以便能够调用sudo命令。
$ sudo visudo
然后在"%sudo ALL=(ALL:ALL) ALL "一行下面添加以下配置,如下所示。
aaronk ALL=NOPASSWD: /bin/su – postgres
保存并关闭文件。
现在,su以aaronk用户身份尝试使用postgres帐户,Shell不应提示您输入密码:
$ sudo su-Postgres