我试图授予用户在网络设备上执行与 root 相同的操作的权限can0
,例如启动或关闭网络设备。我的第一个想法是将设备的组和/或所有者设置为我的用户和我所属的组。
以下是udevadm info -ap $(udevadm info -q path -p /sys/class/net/can0)
设置 udev 规则之前显示的内容:
$ udevadm info -ap $(udevadm info -q path -p /sys/class/net/can0)
looking at device '/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0/net/can0':
KERNEL=="can0"
SUBSYSTEM=="net"
DRIVER==""
ATTR{netdev_group}=="0"
...
looking at parent device '/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0':
KERNELS=="spi0.0"
SUBSYSTEMS=="spi"
DRIVERS=="mcp251x"
这是我尝试过的规则(在/etc/udev/rules.d/50-can.rules
):
KERNELS=="spi0.0", SUBSYSTEMS=="spi", DRIVERS=="mcp251x", GROUP="can", OWNER="<myuser>"
报告udevadm test $(udevadm info -q path -p /sys/class/net/can0)
所有者和组应该正确设置:
...
OWNER 1001 /etc/udev/rules.d/50-can.rules:7
GROUP 1003 /etc/udev/rules.d/50-can.rules:7
...
然而,在重新加载规则(udevadm control -R
)并重新启动后,我仍然无法can0
以用户身份启动或关闭:
$ ip link set can0 down
RTNETLINK answers: Operation not permitted
我知道这条规则匹配正确,因为我可以通过设置属性来更改接口的名称NAME
。
can0
我怀疑问题可能与我在 下找不到接口有关/dev
,这可能表明它没有字符/块设备,并且程序(例如ip
)不会通过传统的 UNIX 所有权访问该设备/权限。如果这是正确的,我如何使用 udev 来完成此操作(即授予我的用户完全权限can0
)?
注意:我看到类似的问题,例如如何授予普通用户对网络接口的写访问权限?,但他们的解决方案是使用 sudo。我宁愿只使用 udev 来完成此操作,但我会将其用作最后的手段。
答案1
根据 @AB 的线索,我最终使用libpam
( pam_cap.so
) 在登录(和 ssh)期间将功能添加CAP_NET_ADMIN
到我的用户inheritable
集,然后将相同的功能添加到/bin/ip
和集。我现在可以作为用户打开或关闭网络接口,而无需依赖.inheritable
permitted
sudo
这里解释了执行此操作的方法:https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capability-per-user