5

質問がとてもばかげている場合はお詫びしますが、私はLinuxとPythonの初心者です。重要なのは、接続されたUSBスティックを検出してファイルを書き込むPythonスクリプトを作成する必要があるということです。私はopenSUSEを使用しています(ただし、理想的な場合、スクリプトはどのLinuxディストリビューションでも機能しません)。現在のバージョンでは、usbを検出し、そのusbがマウントされている場合はファイルを書き込むことができます。しかし、私のマシンでは、ファイルマネージャーで参照した場合にのみUSBがマウントされます。そのusbがパーティションとして検出されるまで、マウントポイントはありません。それで、どうすればシステムにusbをマウントさせることができますか、またはdevnameやdevpath、またはhalmanagerから取得できる別の情報を使用してファイルを書き込むにはどうすればよいですか。ルート権限が必要なため、「mount」コマンドを使用できません

簡略化されたソースコード:

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セキュリティ上の理由から、カーネルはオペレーティング システム内のパーティションのマウントを制御するため、使用する必要があります。スーパーユーザー/管理者権限なしでマウントを使用できます。次のようなことを試してください:

マウント先のディレクトリ ( /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) で 1 つの例を作成し、ここ (http://hal.freedesktop.org/docs/udisks/Device. html#Device.FilesystemMount)。

于 2012-07-03T02:48:41.267 に答える