5

如果问题如此愚蠢,我深表歉意,但我是 linux 和 python 的新手。关键是我需要编写一个 python 脚本来检测连接的 USB 棒并向其写入文件。我使用opensuse(但脚本应该适用于任何Linux发行版。在理想情况下)。当前版本可以检测 USB 并在该 USB 已安装时写入文件。但是只有当我在文件管理器中浏览它时,才会在我的机器上安装 USB。直到那个 USB 被检测为一个分区但没有挂载点。那么,如何强制系统挂载 USB,或者如何使用 devname 或 devpath 或我可以从 hal 管理器获得的其他信息写入文件。我不能使用“mount”命令,因为它需要root权限

简化的源代码:

import dbus, gobject, os

class DeviceAddedListener:
    def __init__(self):
        self.bus = dbus.SystemBus()
        self.hal_manager_obj = self.bus.get_object( "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager")
        self.hal_manager = dbus.Interface(self.hal_manager_obj, "org.freedesktop.Hal.Manager")
        self.hal_manager.connect_to_signal("DeviceAdded", self.added)

    def show(self, name, udi):
        d_object = self.bus.get_object('org.freedesktop.Hal', udi)
        d_interface = dbus.Interface(d_object,'org.freedesktop.Hal.Device')

        if d_interface.QueryCapability("volume"):
            print name
            props = [ "block.device", "volume.label",  "volume.is_mounted", "volume.mount_point", "volume.size"]
            for p in props:
                print '\t', p, " = ",
                try:
                    print d_interface.GetProperty(p)
                except:
                    print "Fail"

    def added(self, udi): 
        self.show("DeviceAdded", udi)
        self.bus.add_signal_receiver(self.property_modified,
            "PropertyModified",
            "org.freedesktop.Hal.Device", 
            "org.freedesktop.Hal",
            udi,
            path_keyword = "sending_device" )

    def property_modified(self, numupdates, updates, sending_device = None): 
        self.show("PropertyModified", sending_device) 



if __name__ == '__main__':
    from dbus.mainloop.glib import DBusGMainLoop
    DBusGMainLoop(set_as_default=True)
    loop = gobject.MainLoop()
    DeviceAddedListener()
    print "running"
    loop.run()

usb插入时的输出

DeviceAdded
block.device  =  /dev/sdb1
volume.label  =  @
volume.is_mounted  =  0
volume.mount_point  =  
volume.size  =  4009722368

usb插入并挂载时的输出

    block.device  =  /dev/sdb1
volume.label  =  @
volume.is_mounted  =  1
volume.mount_point  =  /media/@
volume.size  =  4009722368

谢谢你的帮助!

4

2 回答 2

2

您将不得不使用mount,因为出于安全原因,内核控制操作系统中的挂载分区。您可以在没有超级用户/管理员权限的情况下使用 mount。尝试这样的事情:

确保/mnt/usb1/您要挂载到的目录 ( ) 已经存在,然后

mount /dev/sdb1 /mnt/usb1 -o noauto,users,rw,umask=0

还有一个叫做 autofs 的东西允许自动挂载:

http://linuxconfig.org/automatically-mount-usb-external-drive-with-autofs

于 2012-06-27T14:54:01.760 回答
0

HAL 它已停产,我认为最好使用 UDisk 与笔 USB 配合使用。然后,您可以使用方法 FilesystemMount 和 FilesystemUnmount,我在这里创建一个示例(https://gist.github.com/3037221)并在此处进行官方文档(http://hal.freedesktop.org/docs/udisks/Device. html#Device.FilesystemMount)。

于 2012-07-03T02:48:41.267 回答