![udev,如何阻止进一步的规则运行?](https://linux22.com/image/36668/udev%EF%BC%8C%E5%A6%82%E4%BD%95%E9%98%BB%E6%AD%A2%E8%BF%9B%E4%B8%80%E6%AD%A5%E7%9A%84%E8%A7%84%E5%88%99%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
是否可以(如果可以的话如何)告诉 udev 停止对某个设备执行进一步的规则?
我知道 udev 文件按字母顺序命名有一个规则的顺序/序列。因此,较早的*.rules
可能想要阻止进一步的执行(即按照后来发生的规则的顺序)似乎是合乎逻辑的。
让我们假设我有一个通过 udev 的 USB 内存媒体,并且它的 RUN+ 脚本已经安装,我现在不喜欢系统中的任何其他规则尝试(并且可能失败)再次安装该设备!
为了方便回复,我还想举一个例子:让规则如下:
# 在文件 30.myusb.rules 中 ACTION==“添加”,SUBSYSTEM==“USB”,ATTRS{idVendor}==“1f75”,ATTRS{idProduct}==“0902”,RUN+=“/bin/mount.30.1f75.0902.sh”
现在我想要这个更远(因为 31 > 30)规则不会发生
# 在文件 31.myusb.rules 中 ACTION==“添加”,SUBSYSTEM==“USB”,ATTRS{idVendor}==“1f75”,ATTRS{idProduct}==“0902”,RUN+=“/bin/mount.31.1f75.0902.sh”
用于制造的“过滤器”乌德夫能够判断两条规则是否适用该规则,但我希望 31.myusb.rules 规则永远不会发生。
因此,我正在寻找一种30.myusb.rules
以伪代码建议的方式进行调整的方法
# 在文件 30.myusb.rules 中 ACTION==“添加”,SUBSYSTEM==“USB”,ATTRS{idVendor}==“1f75”,ATTRS{idProduct}==“0902”,RUN+=“/bin/mount.30.1f75.0902.sh” ACTION==“添加”,SUBSYSTEM==“USB”,ATTRS{idVendor}==“1f75”,ATTRS{idProduct}==“0902”,STOP_FURTHER_RULES_WITH_THIS_FILTER
答案1
您可以GOTO
在规则中使用,以便在应用规则后立即跳至标签。如果标签位于规则的最末尾,则跳过所有后续规则。
所以在30.myusb.rules
:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1f75", ATTRS{idProduct}=="0902", RUN+="/bin/mount.30.1f75.0902.sh", GOTO="myusb_end"
并在末尾31.myusb.rules
:
LABEL="myusb_end"
或者使用GOTO="very_end"
, 并放入LABEL="very_end"
最后加载的文件 ( /etc/udev/rules.d/zzzzzzzz.rules
)。
答案2
你必须使用:=代替+=。
# in file 30.myusb.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="1f75", ATTRS{idProduct}=="0902", RUN:="/bin/mount.30.1f75.0902.sh"
来自男人页,
"=" Assign a value to a key. Keys that represent a list are reset and only this single value is assigned. "+=" Add the value to a key that holds a list of entries. ":=" Assign a value to a key finally; disallow any later changes.