当没有 sudo 用户登录系统时,如何以 root 权限(Ubuntu OS)运行特定程序?该程序需要 root 权限才能正常运行。普通用户不应该能够关闭此进程。例如,我有两个用户,Admin 和 Client;只有当客户端登录系统时,该程序才应启动。它需要 root 权限,而客户端不应该能够关闭此进程。
答案1
有几种方法可以做到这一点。Ubuntu 的图形登录由 GDM 提供(如果您使用的是 Kubuntu,则由 KDM 提供)。GDM 由 Upstart 子系统启动。
启动过程遵循以下步骤:
- 系统启动。Upstart 启动服务,包括 GDM (在 /etc/init.d/gdm 中)。
- GDM 启动,初始化 X-server(/etc/gdm/Init/*),并显示 GUI 登录窗口。
- 用户登录。
- PAM 授权发生(/etc/pam.d/gdm)
- GDM 运行登录后脚本 (/etc/gdm/PostLogin/*)。
- GDM 运行会前会议脚本 (/etc/gdm/PreSession/*)。
- GDM 运行会话和初始化脚本
(/etc/gdm/Xsession,/etc/X11/xinit/xinitrc.d/*,/etc/X11/Xsession,/etc/X11/Xsession.d/*)
- 出现用户的桌面。
在哪里运行脚本
之前的一切会话以 root 身份运行。 /etc/gdm/Xsession之后的所有内容都以用户身份运行。这给你留下了三个真正的选择在哪里运行你的脚本。
修改 GDM/KDM登录后或者会前会议脚本来运行你的程序。用户名可以在用户或者用户名环境变量。
使用 PAM 执行脚本。PAM 将在PAM_用户环境变量。将其添加到/etc/pam.d/gdm启动你的脚本:
auth required pam_exec.so /path/to/your/script
- 您可能能够使用 PAM 来匹配特定用户(就像这个答案一样),因此脚本只会为该用户运行,无需匹配用户本身。我没有 PAM 专业知识来解释如何做到这一点。
- 您可能能够使用 PAM 来匹配特定用户(就像这个答案一样),因此脚本只会为该用户运行,无需匹配用户本身。我没有 PAM 专业知识来解释如何做到这一点。
编写 Upstart 脚本运行你的程序。你的脚本将在用户登录时启动,因此我们寻找桌面会话启动GDM 发出的信号会前会议脚本。
因此 Upstart 脚本会检测该信号作为运行触发器:
# start when GDM's PreSession script runs start on desktop-session-start
来自的信号会前会议不传递用户名,因此你需要调整信号。在/etc/gdm/PreSession/默认, 找出初始化行并将其更改为此。您也可以使用用户名代替用户。
# add USER variable so Upstart script can find it initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
如何避免管理员用户
您的脚本需要检查从这些方法之一获取的环境变量中的用户/用户名,并使用它来确定是中止还是继续。标准 shell 脚本方法将起作用。根据您从上述列表中选择的起始位置,用户名可能在用户,用户名, 或者PAM_用户环境变量。
答案2
你可以使用设置用户标识,始终以 root 身份运行程序。从安全角度来看,这可能是一个非常非常糟糕的主意。如果您的某个用户设法利用 setuid 程序,它将使他们获得对整个服务器的 root 访问权限