在Linux中列出所有的USB驱动器

9

如何在Linux中获取可移动驱动器(插入USB)的列表?如果使用KDE、GNOME或其他桌面环境库可以使事情变得更容易,我也没关系。


1
问题应迁移到AskUbuntu。 - Vishwanath Dalvi
11
@Viswanathan说:“Linux”不是Ubuntu(这也正是为什么要有一个单独的askubuntu网站非常愚蠢,但我岔开了话题)。 - Wooble
6
/dev/disk/by-id/usb-* 是当前连接的所有USB大容量存储设备。 - Ignacio Vazquez-Abrams
3
这不是一个特定于Ubuntu的问题。我正在寻找一个编程库解决方案,但是无论如何,我可以使用像Python os模块这样的东西来列出设备,就像Ignacio Vazquez-Abrams提供的解决方案一样。 - Marek Sapota
1
我也正在编写一个需要找到特定USB驱动器的Python脚本。这似乎是一个完全合理的地方,可以在这个问题上寻求并获得帮助。 - Nathan Hartley
显示剩余5条评论
5个回答

5

我认为一个不错的想法是在Python中使用udev接口

这里有一个小例子(当然在你的情况下你需要调整一些过滤器):

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'),

在大多数情况下,这是一种不错的方式,因为新系统使用udev。


2

经过这么长时间,这个问题再次被解锁了...

最终,我使用了UDisks通过D-Bus接口,就像这里所示。


0
这是我在bash中使用的代码: lsblk --pairs --nodeps | grep 'RM="1"'
示例输出: NAME="sda" MAJ:MIN="8:0" RM="1" SIZE="59.5G" RO="0" TYPE="disk" MOUNTPOINT=""
请注意,此处列出的是设备而非其分区。如果您希望同时查看分区,可以使用以下代码: lsblk --pairs | grep 'RM="1"'

0

前段时间我得到了这个小脚本(不是我的),但它确实帮助了我很多,仅供参考。

#!/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 

-1

有没有什么理由不直接从lsusb中解析结果呢?我相信有适用于此的模块,但有时候简单就是最好的。

我无法帮你处理Python,如果是Perl,我可能会这样做:

#!/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;

在我的电脑上,这将导致

[
    [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"
    }
]

请注意,Data::Printer及其p函数仅用于人类友好的对象转储以进行检查。

我不太擅长Perl,但是...我认为一个更好的方法(通常)是使用udev或一些Perl的USB模块,而不是解析ls命令。 - spinus
当然,Perl和Python都有用于此目的的模块,但是lsusb的输出是有效的,并且可以快速完成工作。一如既往,采用的严格程度取决于作者及其任务。 - Joel Berger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接