由用户加载/卸载 psmouse 模块的脚本(无 root)

由用户加载/卸载 psmouse 模块的脚本(无 root)

我想编写一个 shell 脚本,该脚本可以由没有 root 权限的用户执行,只需执行 modprobe -r psmousemodprobe psmouse。这可能吗?我有这个模块:

$ ls -l /lib/modules/4.4.0-116-generic/kernel/drivers/input/mouse/psmouse.ko 
-rw-r--r-- 1 root root 219670 Feb 12 17:06 /lib/modules/4.4.0-116-generic/kernel/drivers/input/mouse/psmouse.ko

直接改一下权限就可以了吗?

答案1

只需调整您的 sudo 安全策略,制定一条规则/etc/sudoers.d即可:

  • 一组定义的用户(根据需要可能只有一个用户或一组),
  • 仅执行modprobermmod,
  • 仅在 cmd 参数上psmouse
  • 有或没有 sudo 密码。

这正是“/etc/sudoers.d”的通常用途。所以这里...(假设单主机配置并记住位于的文件/etc/sudoers.d是按sudo排序的词汇顺序解析的。)

  • 确保/etc/sudoers包括该行#include /etc/sudoers.d
  • 我通常使用个人默认文件/etc/sudoers.d/00_aliases,在其中定义用户、cmd、主机和组别名。这样,我不仅大大减少了sudo visudo对tweak的使用/etc/sudoers,其中包含默认的基本系统设置,而且我的其他文件也/etc/sudoers.d/使用了首先由sudoin解析的别名/etc/sudoers.d/00_aliases
  • 将文件放入 中/etc/sudoers.d,例如命名为 20_psmouse

如果您不打算广泛使用嵌入式 sudoers.d 文件,您可能需要不是创建/etc/sudoers.d/00_aliases临时别名并将其直接包含在您的嵌入式文件中,如下所示。

User_Alias  MOUSE_TWKR = user1[, user2[, user3[, ...]]]
Cmnd_Alias  MOUSE_MOD_TWK = /usr/bin/modprobe, /usr/bin/rmmod
MOUSE_TWKR  your-host = NOPASSWD: MOUSE_MOD_TWK psmouse

真相就在布丁中,因此您需要:
1)查阅man sudoers(在 Archlinux 上,示例从 2038 行中的第 1911 行开始!!)和
2)进行一些实验。
例如,如果上述规则过于宽松,并且您希望限制任何选项与 cmd 的使用modprobe,并且rmmod在您正在管理的上下文中,请将文件条目替换为:

 MOUSE_TWKR  your-host = NOPASSWD: MOUSE_MOD_TWK [!-] psmouse

...并强制输入密码:

 MOUSE_TWKR  your-host = MOUSE_MOD_TWK [!-] psmouse

(*) 将“your-host”替换为您的主机名,或者替换为ALL允许所有主机,如果您的系统是一个独立的系统和/或您不在子网上处理远程管理,则这会减少到您的主机例如...

答案2

更改文件的权限psmouse.ko除了使某人有可能更改文件之外并没有多大作用(这将是一件坏事!)您可以允许他们运行modprobermmod,但这也很危险,因为理论上他们可以加载和卸载系统上安装的任何内核模块!

您想要的是制作一个小帮助程序脚本并允许允许的用户运行该脚本root

  1. 制作脚本:

    /usr/local/bin/load_mouse.sh

    #!/bin/sh
    /sbin/modprobe psmouse
    

    /usr/local/bin/unload_mouse.sh

    #!/bin/sh
    /sbin/rmmod psmouse
    

    这些脚本应该位于可公开访问的目录中(我喜欢/usr/local/bin,但这是个人偏好),具有所有者root:root和权限755root所有权不是必需的,但它使人们更难更改:请记住,这些脚本需要以超级用户身份运行,因此您希望它们是安全的!

  2. 允许用户运行它们

    使用visudo(或添加一个嵌入式文件到/etc/sudoers.d),添加以下内容:

    username ALL=(root) /usr/local/bin/load_mouse.sh,/usr/local/bin/unload_mouse.sh
    

    替换username为适当的用户名,或者%groupname如果您希望组的成员能够运行此命令。

    用户现在应该能够使用sudo /usr/local/bin/load_mouse.sh(或unload_mouse) 运行脚本。如果/usr/local/bin是在他们的PATH,那么sudo load_mouse.sh也可以。

  3. (可选)结束sudo通话

    最后,您可以将其包装sudo在另一个脚本中,以便更容易键入/执行:

    /usr/local/bin/mouse_on

    #!/bin/sh
    sudo /usr/local/bin/load_mouse.sh
    

    /usr/local/bin/mouse_off

    #!/bin/sh
    sudo /usr/local/bin/unload_mouse.sh
    

    这些不需要有任何特殊的权利,但我喜欢让它们拥有root:root的权限755。现在用户只需键入mouse_onand mouse_off(只要您允许他们运行脚本!)

相关内容