2012-06-27 23 views
5

質問が愚かな場合はお詫びしますが、linuxとpythonの新機能です。 ポイントは、接続されたUSBスティックを検出してファイルを書き込むPythonスクリプトを書く必要があることです。私はopensuseを使用しています(しかし、理想的な場合には、Linuxのディストリビューションでスクリプトショールを実行してください)。現在のバージョンでは、usbが検出され、そのusbがマウントされていればファイルを書き込むことができます。しかし、私のマシン上では、私がファイルマネージャでそれを閲覧する場合にのみ、usbがマウントされます。そのUSBがパーティションとして検出され、マウントポイントは検出されなくなるまで。だから、私はどのようにシステムを強制的にusbをマウントすることができますか、またはdevnameやdevpathや他の情報を使ってファイルを書き込むことができます。それはroot権限が必要ですので、私は、コマンドを「マウント」を使用することはできませんLinux上でPythonを使ってusbにファイルを書き込む

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

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は、USBが接続され、搭載され

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

出力に接続した出力

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

ありがとうございました!

+0

なぜ 'mount'を使用できないのですか? 'mount'が動作しない場合、なぜあなたの解決策でしょうか? –

+0

私はマウントを使用するときにメッセージ "マウント:ルートのみがそれを行うことができます" – user1485818

答えて

2

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

あなたはすでに存在している、その後、

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

自動マウントを許可していたautofsと呼ばれるものもありますし、実装されているディレクトリ(/mnt/usb1/)ことを確認してください:

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

+0

ありがとう!しかし何らかの理由でマウントできません。私の '/ mnt /'と '/ media /'フォルダが空で、 'mkdir'コマンドで 'root権限なし'の新しいフォルダを作成できません - 'mkdir:ディレクトリを作成できません'/mnt/usb1 ':Permission denied' 。もちろん、私はrootとしてスクリプトを実行できますが、どのユーザーもそれを実行できるという考えはあります。スクリプトを実行してusbを接続すると、ファイルが書き込まれます。 – user1485818

+0

@ user1485818あなたは2つの方法があります: '/ mnt'または'/media'以外のどこかにマウントするか、またはスクリプトを設定するために一度だけrootアクセスが必要な "install"スクリプトがあります。 Linux上のほぼすべてのプログラムは、設定ファイルなどを設定するためのさまざまな権限が必要であるため、スーパーユーザがインストールする必要があります。 –

+0

これでOKです。ご回答有難うございます!そのようにします。 – user1485818

0

HALが廃止されたので、私はUDiskをペンUSBで使用する方が良いと思います。次に、メソッドFilesystemMountとFilesystemUnmountを使用することができます。私はここで一つの例(https://gist.github.com/3037221)を作成し、ここでは公式なドキュメントを持っています(http://hal.freedesktop.org/docs/udisks/Device)。 html#Device.FilesystemMount)。

関連する問題