我编写了一个工具,当插入 USB 闪存驱动器时,它可以自动格式化和复制文件到其中。需要卸载驱动器才能对其进行格式化。
通常 Nautilus 会在插入驱动器时自动挂载驱动器,因此我必须等待此过程完成,然后卸载驱动器,然后才能格式化它。唯一的问题是,如果用户禁用了自动挂载,那么我的程序将永远等待下去。
我可以在程序启动时更改 dconf 自动挂载设置,然后在退出时将其改回来,但这不是一个好的解决方案,因为如果我的程序崩溃,该设置将无法恢复。
如何才能暂时阻止 Nautilus 仅在我的程序运行时自动安装 USB 驱动器?
答案1
您可以使用PROGRAM
它来检查您的程序是否正在运行以激活该 UDEV 规则,否则它将被禁用,因为pgrep
返回不成功。
程序
执行程序,判断是否匹配;如果程序成功返回,则键为真。设备属性可供环境中执行的程序使用。程序的标准输出可在 RESULT 键中找到。
这只能用于运行时间非常短的前台任务。有关详细信息,请参阅 RUN。
来源: man udev
添加新规则文件
/etc/udev/rules.d/90-prevent-auto-mount.rules
ACTION=="add", KERNEL="sd[a-z][0-9]*", DRIVERS=="usb-storage", PROGRAM="/usr/bin/pgrep yourprogramname", ENV{UDISKS_IGNORE}="1"
重新加载规则
sudo control --reload-rules
顺便说一下,udisk2
是负责自动安装的
答案2
更新:我忽略了最重要的规范:“不对系统进行永久性更改”。我想说这仍然可以解决,但如果不深入研究桌面会话生命周期或桌面事件处理,就无法解决。这不是我的专长。;)
显然,您已经知道如何关闭相关功能。如果您担心程序崩溃时无法恢复该功能,那么只有两种可能:确保您的程序不会崩溃,或者编写一个程序来监视您的程序并在程序未运行时恢复该功能。
但也许还有其他解决方案。您可以将如下行附加到/etc/fstab
:
LABEL=somemagic /path ntfs noauto,user 0 0
然后,如果驱动器上的文件系统带有该标签,它将不受自动挂载功能的影响,您可以不受干扰地挂载它。有关详细信息,请参阅man mount
和man fstab
。您也可以使用 UUID 代替 LABEL,但这取决于您的用例和文件系统。