如何设置它以便su
与当前登录的同一用户相同,即
foo$ su -c 'something' foo
不需要密码?这不会添加或删除任何安全性,因为它应该是一个 noop。
想要这个的原因是我希望有一类用户“低于”root 可以管理在该用户下运行的机器上的某些特定服务,例如,news
或者mysql
(检查他们的数据,更改配置,重新启动等.)。这些用户将获得sudo
该帐户的权限,并且通常效果很好,除了在某些情况下初始化脚本调用
su -c 'start_daemon ...' daemonuser
这导致了这个计划的失败。当然,我可以更改初始化脚本或添加额外的sudo
权限,但我想避免这些异常,因为从长远来看,它们是一团糟。
for 的配置su
在 PAM 中,所以正确的魔法可能就在那里。
您应该
sudo
为此使用,而不是su
. 使用 sudo,您可以NOPASSWD
指定/etc/sudoers
:我认为这里存在一个基本的误解。
当一个 init 脚本做
su -c <start_daemon> <daemon_user>
它正在做的事情是切换守护进程运行的上下文。例如,我们的 tomcat 脚本正是这样做的,以便守护程序可以使用“tomcat”用户权限运行。
现在,如果您更改初始化脚本,
su -c <start_daemon> <your_user>
您将破坏守护程序,因为它期望在特定环境下运行。正如其他人已经说过的那样,授予您的用户对这些脚本的 sudo 权限是让他们能够管理这些守护进程的正确方法。
您可以通过在 /etc/pam.d 中编辑 su 的 PAM 文件并使用 pam_succeed_if 模块来做到这一点。该文件已经有一个根条目,因此复制该行并在其后添加另一行。
账户足够 pam_succeed_if.so uid = 0 use_uid quiet
账户足够 pam_succeed_if.so uid = [你的 UID 这里] use_uid quiet
运行 visudo 并添加以下行:
你的用户名 ALL=(ALL) NOPASSWD: /bin/su - 你的用户名
并将其添加到初始化脚本的开头:
别名 su='sudo su'
“正如其他人已经说过的那样,授予您的用户对这些脚本的 sudo 权限是让他们能够管理这些守护进程的正确方法。” - Zypher
这就是我要做的。他说您应该通过编辑您的 sudoers 文件让用户以 root 身份运行脚本(并且只运行脚本)。由于 root 可以在任何地方使用 su 而无需密码,因此脚本应该可以正常运行。实际上,我现在正在这样做。
请记住,initscript 旨在以 root 身份运行,这就是为什么 su 首先存在的原因(以放弃 root 权限)。