2012-06-27 27 views
5

Soru çok aptalca özür dilerim ama linux ve python'da yeniyim. Bunun anlamı, bağlı bir usb çubuğu algılayacak ve ona bir dosya yazacak bir python betiği yazmam gerektiğidir. Opensuse'u kullanıyorum (ancak ideal durumda herhangi bir linux distro ile script shoild çalışması). Mevcut sürüm, usb takılıysa ve USB takılıysa bir dosya yazabilir. Ama makinemde usb sadece dosya yöneticisinde göz atarsam monte edilir. Bu USB bir parça olarak algılanana kadar, ancak bağlama noktası olmadan. Bu yüzden, sistemi USB'ye monte etmek için nasıl zorlayabilirim ya da devname veya devpath kullanarak bir dosyayı nasıl yazabilirim ya da hal yöneticisinden alabileceğim başka bir bilgiyi nasıl yazabilirim. Bir kök izin gerektirir çünkü komutunu "montaj" kullanamazsınızpython on linux ile dosyaya yazmak

Basitleştirilmiş Kaynak kodu:

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 takılı ve takılı

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

çıktı takılı çıktı

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

Yardımlarınız için teşekkürler!

+0

Neden 'mount' kullanamazsınız? Eğer 'mount' işe yaramazsa, çözümünüzü neden istiyorsunuz? –

+0

Montajı kullandığımda "mount: only root bunu yapabilirim" mesajım var – user1485818

cevap

2

mount'u kullanmanız gerekecek çünkü çekirdek işletim sistemindeki güvenlik nedenleriyle montaj bölümlerini kontrol ediyor. , süper kullanıcı/yönetici ayrıcalıkları olmadan bağlanabilir.

Eğer montaj edilir dizin (/mnt/usb1/) zaten var etmek emin olun ve

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

sonra otomatik montaj izin yok autofs denilen bir şey de var: Böyle bir şey deneyin

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

+0

Teşekkürler! Ama bir sebepten dolayı onu monte edemiyorum. benim '/ mnt /' ve '/ media /' klasörleri boş ve 'mkdir' komutu ile 'root izni' olmadan yeni bir klasör oluşturamıyorum - 'mkdir:'/mnt/usb1 'dizinini oluşturamıyor': İzin reddedildi ' . Tabii ki, betiği bir root olarak çalıştırabilirim, ancak herhangi bir kullanıcının bunu yapabildiğini düşünebilirim. Sadece komut dosyasını çalıştırın, bir USB'ye takın ve bir dosyaya yazacaktır. – user1485818

+0

@ user1485818 İki seçeneğiniz vardır: '/ mnt' veya'/media' dışında bir yere yerleştirmeyi deneyebilirsiniz ya da komut dosyasını ayarlamak için bir kerelik root erişimi gerektiren bir "install" betiğine sahip olabilirsiniz. Linux üzerindeki hemen hemen tüm programların, superuser tarafından yüklenmesi gerektiğini göreceksiniz çünkü yapılandırma dosyalarını, vb. Ayarlamak için çeşitli izinlere ihtiyaç duyuyorlar. –

+0

Tamam, tamam. Cevabınız için teşekkürler! Bu şekilde yapacak. – user1485818

0

HAL, üretilmiyor, daha iyi UDisks kalem USB ile çalışmak için düşünüyorum. Daha sonra, FilesystemMount ve FilesystemUnmount yöntemlerini kullanabilirsiniz, burada bir örnek (https://gist.github.com/3037221) oluşturabilirim ve burada resmi bir belgeye sahibim (http://hal.freedesktop.org/docs/udisks/Device. html # Device.FilesystemMount).

İlgili konular