防止 nautilus 在 bash 脚本中显示已安装的分区

防止 nautilus 在 bash 脚本中显示已安装的分区

在我的 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标志。

相关内容