2012-06-27 12 views
5

pido disculpas si la pregunta es tan estúpida, pero estoy de nuevo en Linux y Python. El punto es que tengo que escribir una secuencia de comandos python que detectará la memoria USB conectada y le escribirá un archivo. Uso opensuse (pero script shoild trabajo con cualquier distribución de Linux. En el caso ideal). La versión actual puede detectar usb y escribir un archivo si ese usb está montado. Pero en mi máquina el usb está montado solo si lo busco en el administrador de archivos. Hasta ese usb detectado como una partición pero sin punto de montaje. Entonces, ¿cómo puedo forzar al sistema para que monte usb o cómo puedo escribir un archivo usando devname o devpath u otra información que puedo obtener del administrador de hal? No puedo usar "montaje" de comandos, ya que requiere un permiso de raízarchivo de escritura en USB con el pitón en Linux

El código fuente simplificado:

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() 

La salida cuando USB enchufado

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

La salida cuando USB conectado y montado

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

¡Gracias por la ayuda!

+0

Por qué no puedes usar 'mount'? Si 'mount' no funciona, ¿por qué sería su solución? –

+0

Cuando uso mount tengo un mensaje "mount: only root puede hacer eso" – user1485818

Respuesta

2

Usted tendrá que utilizar mount porque los controles del kernel montar particiones en el sistema operativo por razones de seguridad. Usted puede use mount sin privilegios de superusuario/administrador. Intentar algo como esto:

Asegúrese de que el directorio (/mnt/usb1/) está montando a que ya existe, y luego

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

También hay algo que se llama autofs que sí permite el montaje automático:

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

+0

¡Gracias! Pero no puedo montarlo por alguna razón. mis carpetas '/ mnt /' y '/ media /' están vacías y no puedo crear una nueva carpeta con el comando 'mkdir' sin 'permiso de root' - 'mkdir: no puedo crear el directorio '/ mnt/usb1': Permiso denegado ' . Por supuesto, puedo ejecutar el script como una raíz, pero la idea de que cualquier usuario puede hacerlo. Simplemente ejecute el script, conecte un usb y le escribirá un archivo. – user1485818

+0

@ user1485818 Usted tiene dos opciones: puede tratar de montarlo en otro lugar que '/ mnt' o'/media', o puede tener una secuencia de comandos "instalar", que necesita acceso a la raíz de una sola vez para establecer la secuencia de comandos. Notará que casi todos los programas en Linux tienen que ser instalados por el superusuario porque necesitan varios permisos para configurar sus archivos de configuración, etc. –

+0

Entonces, OK. ¡Gracias por tu respuesta! Haré de esa manera. – user1485818

0

El HAL se suspendió, creo que mejor udisks utilizar para trabajar con lápiz USB. A continuación, puede utilizar métodos FilesystemMount y FilesystemUnmount, puedo crear un ejemplo aquí (https://gist.github.com/3037221) y tienen documantation oficial aquí (http://hal.freedesktop.org/docs/udisks/Device. html # Device.FilesystemMount).

Cuestiones relacionadas