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

Ale*_*der 3 security boot privileges login ubuntu

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

qua*_*ote 7

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

启动过程遵循以下步骤:

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

在哪里运行你的脚本

XSession之前的所有内容都以root身份运行。 /etc/gdm/Xsession和之后的所有内容都以用户身份运行。这给你留下了三个实物期权哪里运行脚本。

  1. 修改 GDM/KDM 的PostLoginPreSession脚本以运行您的程序。用户名在USERUSERNAME环境变量中可用。

  2. 使用 PAM 执行您的脚本。PAM 将在PAM_USER环境变量中设置授权用户。将此添加到/etc/pam.d/gdm以启动您的脚本:

    auth  required  pam_exec.so   /path/to/your/script
    
    Run Code Online (Sandbox Code Playgroud)
    • 您也许可以使用 PAM 来匹配特定用户(如本答案中所示),因此脚本只会为该用户运行,而无需匹配用户本身。我没有 PAM 专业知识来解释如何做到这一点。

  3. 编写一个 Upstart 脚本来运行你的程序。您的脚本将在用户登录时启动,因此我们查找GDM 的PreSession脚本发出的桌面会话启动信号。

    因此,Upstart 脚本会将该信号检测为运行触发器:

    # start when GDM's PreSession script runs
    start on desktop-session-start
    
    Run Code Online (Sandbox Code Playgroud)

    来自PreSession的信号不会传递用户名,因此您需要调整信号。在/etc/gdm/PreSession/Default 中,找到initctl行并将其更改为此。您也可以使用USERNAME代替USER

    # add USER variable so Upstart script can find it
    initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
    
    Run Code Online (Sandbox Code Playgroud)

    有关更多详细信息,请参阅Upstart及其启动事件的联机帮助页。


如何避免管理员用户

您的脚本将需要检查它从这些方法之一获取的环境变量中的用户/用户名,并使用它来确定是中止还是继续。标准的 shell 脚本方法将起作用。根据您从上述列表中选择的起始位置,用户名可能在USERUSERNAMEPAM_USER环境变量中可用。