在Linux上使用Python将文件写入USB

5
我很抱歉如果问题看起来很愚蠢,但我对Linux和Python都很陌生。我的问题是需要编写一个Python脚本,它可以检测连接的USB设备并向其写入文件。我使用的是OpenSUSE(但在理想情况下,该脚本应适用于任何Linux发行版)。目前版本只有在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

感谢您的帮助!

为什么不能使用mount?如果mount无法工作,为什么您的解决方案会有效呢? - Colonel Panic
当我使用mount命令时,会出现“mount: 只有root用户才能执行该操作”的提示信息。 - user1485818
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


谢谢!但是由于某些原因,我无法挂载它。我的'/mnt/'和'/media/'文件夹为空,并且我无法使用'mkdir'命令创建新文件夹而不需要'root权限' - 'mkdir:无法创建目录`/mnt/usb1':权限被拒绝'。当然,我可以以root身份运行脚本,但任何用户都可以这样做的想法。只需运行脚本,插入USB并将文件写入其中。 - user1485818
@user1485818 你有两个选择:你可以尝试将它挂载到/mnt/media以外的其他地方,或者你可以编写一个“安装”脚本,该脚本需要一次超级用户访问权限来设置你的脚本。你会发现,Linux 上几乎所有程序都必须由超级用户安装,因为它们需要各种权限来设置其配置文件等。 - Alex W
好的,谢谢你的回答!我会按照那种方式去做。 - user1485818

0

HAL已经停用,我认为最好使用UDisks来处理USB闪存驱动器。然后,您可以使用FilesystemMount和FilesystemUnmount方法,我在这里创建了一个示例(https://gist.github.com/3037221),并且官方文档在这里(http://hal.freedesktop.org/docs/udisks/Device.html#Device.FilesystemMount)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接