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

coc*_*mac 2 root privileges 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
Run Code Online (Sandbox Code Playgroud)

有趣的是,运行rfkill以禁用和启用无线访问的工作方式如此处所述即使我是rfkill从我的帐户运行(即,不是 asroot和 not withsudo或类似)

如何不rfkillrequire ,因为通常启用/禁用硬件的命令需要以特权root运行?root

A.B*_*A.B 5

现代 Linux 系统生态系统(可能基于systemd)/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--

Run Code Online (Sandbox Code Playgroud)

因此,这里额外的 ACL 授予所有者对设备文件的访问权限:

user:1000:rw-
Run Code Online (Sandbox Code Playgroud)

如果不在用户实际登录的部分(有sleep 5时间切换到带有登录提示的控制台),则此 ACL 会被删除(如果存在):

$ 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--

Run Code Online (Sandbox Code Playgroud)

只要链接的内核驱动程序没有特别限制设备文件上 ACL 之外的进一步访问权限或所有权,这适用于使用它的应用程序,无需额外的权限。

运行(作为 root 会更好,但结果并没有真正改变):

inotifywait -m -r -e attrib /dev
Run Code Online (Sandbox Code Playgroud)

并切换两次,到带有登录提示的控制台并返回,以获得一个想法,通常也这样做:

  • 音频相关文件 ( /dev/snd/)
  • 视频相关文件 ( /dev/dri/)
  • /dev/cdrom可能是一些可移动设备文件(例如: ...的目标)
  • 用于虚拟化的 KVM ( /dev/kvm)
  • 可能是我错过的其他文件。

这可能不反映默认值,但提供了一个想法。

快速搜索在 Linux 上的 Multi-Seat中的systemd文档中找到了此条目:

请注意,logind管理许多设备类上的 ACL ,以便只要用户在其上有活动会话,就允许用户代码访问连接到席位的设备节点。这对于应用程序来说基本上是透明的。

当使用systemd进行管理时,至少有两个组件发挥作用:

  • udevd标记系统上出现的符合条件的设备TAG+="uaccess"

    根据经验,该列表可以通过类似的内容找到(没有/lib符号链接的系统/usr/lib也应该在 中搜索/usr/lib/udev/rules.d):

    grep -rw uaccess /etc/udev/rules.d /lib/udev/rules.d
    
    Run Code Online (Sandbox Code Playgroud)

    在其他结果中,可以在以下位置找到 rfkill 的一行/lib/udev/rules.d/70-uaccess.rules

    KERNEL=="rfkill", SUBSYSTEM=="misc", TAG+="uaccess"
    
    Run Code Online (Sandbox Code Playgroud)
  • Logind跟踪用户席位更改(当然除了创建之外),并在用户席位处于活动状态时更改先前用uaccess标记的设备的 ACL

    对于小细节:seat_set_active()-> seat_apply_acls()-> devnode_acl_all(),稍后检查uaccess标记。