我在最后看到了这个声明这个答案:
PS:我不知道为什么 rfkill 在以非特权用户身份运行时起作用。在我的 Mint 上,它没有 setuid 或 setgid 位。
我很好奇,查看了我的 Arch 系统。这是我的系统上的内容sudo
和rfkill
外观。文件大小和日期已被省略。看起来没有 setuid 位(为了比较,rfkill
有一个)。sudo
$ /usr/bin/env ls -lah $(which sudo) $(which rfkill)
-rwxr-xr-x 1 root root [OMITTED] /sbin/rfkill
-rwsr-xr-x 1 root root [OMITTED] /sbin/sudo
有趣的是,运行rfkill
以禁用和启用无线访问是有效的如此处所述,即使我正在rfkill
从我的帐户运行(即,不是 asroot
和 not withsudo
或类似)。
如何rfkill
不 require root
,因为通常启用/禁用硬件的命令需要以root
特权运行?
答案1
现代Linux系统生态系统,大概什么时候系统/dev
基于,可以在物理登录时(即:在键盘前)更改条目的访问权限。
人们可以比较 的所有权/dev/rfkill
。例如,在 Debian 12 系统上查看 UID 1000 登录本地(物理)会话的用户时:
$ echo $UID
1000
$ getfacl -n /dev/rfkill
getfacl: Removing leading '/' from absolute path names
# file: dev/rfkill
# owner: 0
# group: 106
user::rw-
user:1000:rw-
group::rw-
mask::rw-
other::r--
因此,这里额外的 ACL 授予所有者对设备文件的访问权限:
user:1000:rw-
如果不在用户实际登录的部分(sleep 5
有时间切换到带有登录提示的控制台),则此 ACL 会被删除(如果存在):
$ sleep 5; getfacl -n /dev/rfkill
getfacl: Removing leading '/' from absolute path names
# file: dev/rfkill
# owner: 0
# group: 106
user::rw-
group::rw-
mask::rw-
other::r--
只要链接的内核驱动程序没有特别限制设备文件上 ACL 之外的进一步访问权限或所有权,这适用于使用它的应用程序,无需额外的权限。
运行(作为 root 会更好,但结果并没有真正改变):
inotifywait -m -r -e attrib /dev
并切换两次,到带有登录提示的控制台并返回,以获得一个想法,通常也这样做:
- 音频相关文件 (
/dev/snd/
) - 视频相关文件 (
/dev/dri/
) - 可能是一些可移动设备文件(例如:...的目标
/dev/cdrom
) - 用于虚拟化的 KVM (
/dev/kvm
) - 可能是我错过的其他文件。
这可能不反映默认值,但提供了一个想法。
快速搜索发现此条目位于系统文档位于Linux 上的多席位:
注意已登录管理多种设备类别上的 ACL,允许用户代码访问连接到座位的设备节点只要用户有一个活动会话。这对于应用程序来说基本上是透明的。
当使用以下方式进行管理时系统至少有两个组件发挥作用:
乌德夫德标记系统上出现的符合条件的设备
TAG+="uaccess"
根据经验,该列表可以通过类似的内容找到(没有
/lib
符号链接的系统/usr/lib
也应该在 中搜索/usr/lib/udev/rules.d
):grep -rw uaccess /etc/udev/rules.d /lib/udev/rules.d
在其他结果中,可以在以下位置找到 rfkill 的一行
/lib/udev/rules.d/70-uaccess.rules
:KERNEL=="rfkill", SUBSYSTEM=="misc", TAG+="uaccess"
已登录跟踪用户席位更改(当然除了创建之外)并更改先前标记的设备的 ACLuaccess当用户席位处于活动状态时
对于小细节:
seat_set_active()
->seat_apply_acls()
->devnode_acl_all()
,稍后检查uaccess标签。