如何在不需要密码的情况下切换到另一个或特定的用户帐户。例如,我们有一个名为postgres的用户帐户(PostgreSQL默认超级用户系统帐户),我们希望名为postgres的组中的每个用户(通常是我们的PostgreSQL数据库和系统管理员)使用su命令切换到postgres帐户,而不需要输入密码。
默认情况下,只有root用户可以在不输入密码的情况下切换到另一个用户帐户。任何其他用户将被提示输入他们要切换到的用户帐户的密码(或者如果他们使用sudo 命令,他们将被提示输入他们的密码),如果没有提供正确的密码,会得到一个
authentication failed
错误有两种解决方案
1. 使用PAM认证模块
代码语言:javascript复制
PAM
(Pluggable authentication modules
) 是现代 Linux 操作系统上用户身份验证的核心。为了允许特定组中的用户无需密码即可切换到另一个用户帐户,我们可以修改该组的默认 PAM 设置su command
在里面/etc/pam.d/su
文件。
# vim /etc/pam.d/su
OR
$ sudo vim /etc/pam.d/su
代码语言:javascript复制之后添加以下配置
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
代码语言:javascript复制在上面的配置中,第一行检查目标用户是否是
postgres
,如果是,则服务检查当前用户,否则,default=1
跳过该行并执行正常的认证步骤。
auth [success=ignore default=1] pam_succeed_if.so user = postgres
代码语言:javascript复制接下来的行检查当前用户是否在组中
postgres
, 如果yes
,则认为身份验证过程成功并返回足够的结果。否则,将执行正常的身份验证步骤。
auth sufficient pam_succeed_if.so use_uid user ingroup postgres
代码语言:javascript复制保存文件并关闭它。
接下来,添加用户(例如
rumenz
) 你想要su
的账户postgres
没有组的密码postgres
使用usermod 命令。
$sudo usermod -aG postgres rumenz
代码语言:javascript复制现在尝试
su
的postgres
作为用户的帐户rumenz
,你不应被提示输入密码,如下面的屏幕截图所示:
$ su - postgres
2. 使用Sudoers文件
代码语言:javascript复制你还
su
可以通过在sudoers文件中进行一些更改而无需密码即可访问其他用户。在这种情况下,用户(例如rumenz
) 谁将切换到另一个用户帐户(例如postgres
) 应该在sudoers文件或 sudo 组中才能调用sudo command
.
$ sudo visudo
代码语言:javascript复制然后在该行下方添加以下配置
%sudo ALL=(ALL:ALL) ALL
代码语言:javascript复制rumenz ALL=NOPASSWD: /bin/su – postgres
代码语言:javascript复制保存并关闭文件。
现在尝试到
su
帐户postgres
作为用户rumenz
,shell 不应提示你输入密码:
$ sudo su - postgres
代码语言:javascript复制还有其它的配置选项参考帮助手册。
$ man pam.conf
$ man sudo