![防止 nautilus 在 bash 脚本中显示已安装的分区](https://linux22.com/image/1108938/%E9%98%B2%E6%AD%A2%20nautilus%20%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%98%BE%E7%A4%BA%E5%B7%B2%E5%AE%89%E8%A3%85%E7%9A%84%E5%88%86%E5%8C%BA.png)
在我的 bash 脚本中,我挂载分区、检查分区、将文件复制到分区并卸载。当脚本挂载分区时,Nautilus 会弹出一个窗口,显示分区并窃取焦点。这是我想避免的事情。
注意:我知道我可以在系统设置、详细信息、可移动媒体中更改此行为,Never prompt or start programs on media insertion
但我不想更改行为,例如,如果插入了 USB 记忆棒,我只想在我的 bash 脚本中阻止它。由于此脚本在其他用户的计算机上运行,我无法修改这些设置(在脚本中),因为如果它异常终止,它将保留修改后的设置(我也不认为有必要这样做)。
实际上,这种自动显示似乎不一致。如果我从终端执行完全相同的命令,Nautilus 不会显示,而且我知道我的脚本中还有其他挂载点没有显示。那么是什么原因造成的呢?以下是代码示例(两者都导致单独的 nautilus 窗口弹出):
mount $dev $target
mkdir -p $target/home
mount $homedev $target/home
我感兴趣的是了解挂载向 Nautilus 发出信号的过程以及为什么会发生这种情况(如果我从终端挂载分区则不会发生这种情况)。以及防止这种情况发生的最佳方法是什么。
我注意到这种行为从版本 11.10 开始(如果我没记错的话)。我目前正在运行 12.04,但该脚本必须在所有受支持的版本上运行。我不认为解决方案应该涉及修改系统设置(版本之间可能有所不同)。例如,如果您查看其他挂载分区的东西(如 os-prober),当它挂载不同的分区时不会弹出任何 nautilus 窗口。
该脚本可以找到这里。 和这是部分鹦鹉螺号出现的地方。我认为它也出现这里,但我一直重点测试第一个链接。这是它不会弹出的地方,在其他挂载之前调用 - 请注意,我已将第一个重写为 --read-only 并在 if 语句中,这没有什么区别。
理想情况下,答案将解释为什么会发生这种情况以及如何防止这种情况发生,换句话说,解释为什么 in-script 的mount
处理方式与从终端发出的脚本不同。如果解决方案解释充分且实用,可以支持所有桌面环境(ubuntu、kubuntu、xubuntu、lubuntu 等),那么一个好的解决方法也会被接受 - 我也想避免测试的指数级增长以验证它。
提前致谢
============
按照解决方案帕帕舒的链接:
add_udev_rules ()
{
for i in "$dev" "$homedev" "$bootdev" "$usrdev"; do
if [ -n "$i" ]; then
block=${i#/dev/}
echo "KERNEL==\"""$block""\",ENV{UDISKS_PRESENTATION_HIDE}=\"1\"" >> "$wubi_move_dir"/wubi_move.rules
fi
done
cp "$wubi_move_dir"/wubi_move.rules /etc/udev/rules.d/wubi_move.rules
udevadm trigger > /dev/null 2>&1
}
remove_udev_rules ()
{
rm /etc/udev/rules.d/wubi_move.rules
rm "$wubi_move_dir"/wubi_move.rules
udevadm trigger > /dev/null 2>&1
}
这实现了预期的结果,但感觉像是一种大锤式的方法。我相信 udev 中可能有一个微调,可以让分区在挂载时仍显示在 Nautilus(和其他文件浏览器)中,而不会弹出。顺便说一句,如果有人想尝试一下,以下脚本将显示 nautilus 的弹出效果:
mkdir -p /tmp/testmount
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1
mount /dev/sda1 /tmp/testmount
sleep 3
umount /dev/sda1
rmdir /tmp/testmount
我将继续玩,udev
并且我已经提交了漏洞,因为对于未插入的分区,在安装时充当插入的 USB/媒体卡没有任何意义。此外,这udevadm trigger
似乎不是一项廉价的操作(至少在 12.04 上)会暂时冻结所有内容。
因此,总而言之,我有一个可行的解决方案(感谢所有提供帮助的人),我可能会也可能不会实施(尚不确定);但我会继续寻找其他方法。谢谢
答案1
尝试一下这个建议:http://www.worldofnubcraft.com/969/hide-your-disks-or-partitions-from-nautilus/
我相当确信它与 udev 信号和处理有关。
答案2
尝试包装你的脚本:
#!/bin/bash
#
# disable nautilus automount
#
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount false
# put your script here
#
...
# enable back nautilus automount
#
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount true
未测试,因为我使用的是 10.04
更新:
#!/bin/bash
#
# disable nautilus automount
#
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount false
# put CALLING your script here to survive its crashes
#
/bin/bash -c "/whenever/it/is/placed/script.sh"
# enable back nautilus automount
#
gconftool --type Boolean --set /apps/nautilus/preferences/media_automount true
答案3
您可以通过添加新的 udev 规则来阻止闪存驱动器自动挂载。在该规则中,您可以按供应商、序列号和其他属性指定闪存驱动器。请参阅属性{}输出中的行:
udevadm info -a --name=sdb1
您应该将该脚本放入/etc/udev/rules.d具有特殊文件名的文件夹,例如 81-usb-wubi-移动.规则
规则可能看起来像
ACTION=="add", KERNEL=="sdb?", SUBSYSTEMS=="usb", ATTRS{serial}=="001CC07CEE5EFB91C91B235C", ENV{UDISKS_PRESENTATION_HIDE}="1", ENV{UDISKS_PRESENTATION_NOPOLICY}="1"
也可以看看:
答案4
尝试mount
使用-n
和-i
标志。