2011-05-06 7 views
9

¿Cómo puedo obtener una lista de unidades extraíbles (conectadas a USB) en Linux? Estoy de acuerdo con el uso de KDE, GNOME u otras librerías DE si facilita las cosas.Listado de todas las unidades USB en Linux

+1

pregunta debería migrar a askubuntu –

+11

@Viswanathan: "Linux" no es Ubuntu (que es, por supuesto, por qué tener un sitio askubuntu por separado es estúpido, pero estoy divagando) – geoffspear

+0

¿Es esta una pregunta de programación? Porque las respuestas hasta ahora no están relacionadas con la programación. – Gabe

Respuesta

3

Creo que una buena idea es usar udev interface de python.

pequeño ejemplo (por supuesto en su caso de que tenga algún tipo de filtrado ajustar):

In [1]: import pyudev 
In [2]: pyudev.Context() 
In [3]: ctx = pyudev.Context() 
In [4]: list(ctx.list_devices(subsystem='usb')) 
Out[4]: 
[Device(u'/sys/devices/pci0000:00/0000:00:1a.0/usb2'), 
Device(u'/sys/devices/pci0000:00/0000:00:1a.0/usb2/2-0:1.0'), 
Device(u'/sys/devices/pci0000:00/0000:00:1a.0/usb2/2-2'), 

Es una buena manera en la mayoría de los casos como los nuevos sistemas utilizan udev.

0

¿Alguna razón para no analizar los resultados de lsusb? Estoy seguro de que hay módulos para esto, pero, de nuevo, fácil a veces es lo mejor.

no puedo ayudar con Python, Perl en que podría hacer:

#!/usr/bin/env perl 

use strict; 
use warnings; 

my @data; 
foreach (`lsusb`) { 
    next unless /Bus (\S+) Device (\S+): ID (\S+) (.*)/; 
    push @data, { bus => $1, device => $2, id => $3, info => $4 }; 
} 

use Data::Printer; 
p @data; 

la que, en mi equipo, los resultados en

[ 
    [0] { 
     bus 005, 
     device 001, 
     id "1d6b:0001", 
     info "Linux Foundation 1.1 root hub" 
    }, 
    [1] { 
     bus 004, 
     device 001, 
     id "1d6b:0001", 
     info "Linux Foundation 1.1 root hub" 
    }, 
    [2] { 
     bus 003, 
     device 001, 
     id "1d6b:0001", 
     info "Linux Foundation 1.1 root hub" 
    }, 
    [3] { 
     bus 002, 
     device 001, 
     id "1d6b:0001", 
     info "Linux Foundation 1.1 root hub" 
    }, 
    [4] { 
     bus 001, 
     device 003, 
     id "0bda:0158", 
     info "Realtek Semiconductor Corp. USB 2.0 multicard reader" 
    }, 
    [5] { 
     bus 001, 
     device 002, 
     id "064e:a129", 
     info "Suyin Corp. " 
    }, 
    [6] { 
     bus 001, 
     device 001, 
     id "1d6b:0002", 
     info "Linux Foundation 2.0 root hub" 
    } 
] 

Tenga en cuenta que Data::Printer y su función p son humanos Vertido de objetos amigables solo con fines de inspección.

+0

No soy bueno con Perl pero ... creo que una mejor manera (generalmente) es usar el udev o algún módulo usb para Perl en lugar de analizar los comandos 'ls'. – spinus

+0

Ciertamente, tanto Perl como Python tienen módulos para este fin, pero la salida de 'lsusb' es válida y hace el trabajo rápidamente. Como siempre, el nivel de rigor empleado depende del autor y su tarea. –

2

Después de todo este tiempo la cuestión quedó desbloqueado de nuevo ...

Al final he utilizado udisks través de la interfaz D-Bus como se muestra here.

0

Hace algún tiempo que me dieron este pequeño script (que no es mío), pero sin duda me ayudó mucho poner apenas para la referencia

#!/usr/bin/python 
import sys 
import usb.core 
# find USB devices 
dev = usb.core.find(find_all=True) 
# loop through devices, printing vendor and product ids in decimal and hex 
for cfg in dev: 
     try: 
       #print dir(cfg) 
       sys.stdout.write('Decimal VendorID=' + str(cfg.idVendor) + ' & ProductID=' + str(cfg.bDeviceClass) + ' ' + str(cfg.product) + ' ' + str(cfg.bDeviceSubClass)+ ' ' + str(cfg.manufacturer)+'\n') 
     except: 
       print 
Cuestiones relacionadas