我想编写一个 shell 脚本,该脚本可以由没有 root 权限的用户执行,只需执行
modprobe -r psmouse
或modprobe 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
即可:
- 一组定义的用户(根据需要可能只有一个用户或一组),
- 仅执行
modprobe
和rmmod
, - 仅在 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/
使用了首先由sudo
in解析的别名/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
除了使某人有可能更改文件之外并没有多大作用(这将是一件坏事!)您可以允许他们运行modprobe
和rmmod
,但这也很危险,因为理论上他们可以加载和卸载系统上安装的任何内核模块!
您想要的是制作一个小帮助程序脚本并允许允许的用户运行该脚本root
:
制作脚本:
/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
和权限755
。root
所有权不是必需的,但它使人们更难更改:请记住,这些脚本需要以超级用户身份运行,因此您希望它们是安全的!允许用户运行它们
使用
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
也可以。(可选)结束
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_on
andmouse_off
(只要您允许他们运行脚本!)