如果不是 root(或使用 sudo),rfkill 如何工作?

如果不是 root(或使用 sudo),rfkill 如何工作?

我在最后看到了这个声明这个答案:

PS:我不知道为什么 rfkill 在以非特权用户身份运行时起作用。在我的 Mint 上,它没有 setuid 或 setgid 位。

我很好奇,查看了我的 Arch 系统。这是我的系统上的内容sudorfkill外观。文件大小和日期已被省略。看起来没有 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标签。

相关内容