当没有 sudo 用户登录系统时,如何以 root 权限(Ubuntu 操作系统)运行特定程序?

当没有 sudo 用户登录系统时,如何以 root 权限(Ubuntu 操作系统)运行特定程序?

当没有 sudo 用户登录系统时,如何以 root 权限(Ubuntu OS)运行特定程序?该程序需要 root 权限才能正常运行。普通用户不应该能够关闭此进程。例如,我有两个用户,Admin 和 Client;只有当客户端登录系统时,该程序才应启动。它需要 root 权限,而客户端不应该能够关闭此进程。

答案1

有几种方法可以做到这一点。Ubuntu 的图形登录由 GDM 提供(如果您使用的是 Kubuntu,则由 KDM 提供)。GDM 由 Upstart 子系统启动。

启动过程遵循以下步骤:

  1. 系统启动。Upstart 启动服务,包括 GDM (在 /etc/init.d/gdm 中)。
  2. GDM 启动,初始化 X-server(/etc/gdm/Init/*),并显示 GUI 登录窗口。
  3. 用户登录。
    1. PAM 授权发生(/etc/pam.d/gdm
    2. GDM 运行登录后脚本 (/etc/gdm/PostLogin/*)。
    3. GDM 运行会前会议脚本 (/etc/gdm/PreSession/*)。
    4. GDM 运行会话初始化脚本
      /etc/gdm/Xsession/etc/X11/xinit/xinitrc.d/*/etc/X11/Xsession/etc/X11/Xsession.d/*
  4. 出现用户的桌面。

在哪里运行脚本

之前的一切会话以 root 身份运行。 /etc/gdm/Xsession之后的所有内容都以用户身份运行。这给你留下了三个真正的选择在哪里运行你的脚本。

  1. 修改 GDM/KDM登录后或者会前会议脚本来运行你的程序。用户名可以在用户或者用户名环境变量。

  2. 使用 PAM 执行脚本。PAM 将在PAM_用户环境变量。将其添加到/etc/pam.d/gdm启动你的脚本:

    auth  required  pam_exec.so   /path/to/your/script
    
    • 您可能能够使用 PAM 来匹配特定用户(就像这个答案一样),因此脚本只会为该用户运行,无需匹配用户本身。我没有 PAM 专业知识来解释如何做到这一点。

  3. 编写 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 访问权限

相关内容