2012-06-27 139 views
5

如果問題太蠢,但我是linux和python的新手,我表示歉意。 問題是我需要編寫一個python腳本來檢測連接的usb棒並向它寫入一個文件。我使用opensuse(但理想情況下腳本可以和任何linux發行版一起工作)。當前版本可以檢測USB並寫入一個文件,如果該USB被安裝。但是在我的機器上,只有當我在文件管理器中瀏覽它時,纔會安裝USB。在此之前,USB檢測爲部分,但沒有安裝點。那麼,我該如何強制系統掛載usb,或者如何使用devname或devpath寫入文件,或者我可以從hal manager獲得的信息。我不能使用「加載」命令,因爲它需要一個根權限在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 IN

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 

感謝您的幫助!

+0

爲什麼你不能使用'mount'?如果'mount'不起作用,爲什麼你的解決方案? –

+0

當我使用mount時,我有一個消息「mount:只有root可以做到這一點」 – user1485818

回答

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

+0

謝謝!但由於某些原因,我無法安裝它。我的'/ mnt /'和'/ media /'文件夾是空的,我不能用'mkdir'命令創建沒有'root權限'的新文件夾 - 'mkdir:不能創建目錄'/ mnt/usb1':Permission denied' 。當然,我可以以腳本運行腳本,但任何用戶都可以這樣做。只需運行該腳本,插入一個USB,它將寫入一個文件。 – user1485818

+0

@ user1485818您有兩種選擇:您可以嘗試將其掛載在'/ mnt'或'/ media'之外的某個位置,或者您可以使用需要一次性root訪問權限的「install」腳本來設置腳本。您會注意到幾乎所有Linux上的程序都必須由超級用戶安裝,因爲他們需要各種權限來設置其配置文件等。 –

+0

因此,好的。感謝您的回答!將這樣做。 – user1485818

0

HAL它已停產,我認爲使用UDisks更好地使用筆式USB。然後,你可以使用方法FilesystemMount和FilesystemUnmount,我在這裏創建一個例子(https://gist.github.com/3037221)並且在這裏有官方文檔(http://hal.freedesktop.org/docs/udisks/Device。 HTML#Device.FilesystemMount)。