【问题标题】:Listing all USB drives in Linux列出 Linux 中的所有 USB 驱动器
【发布时间】:2011-08-20 03:59:37
【问题描述】:

如何在 Linux 中获取可移动驱动器(插入 USB)的列表?如果可以让事情变得更简单,我可以使用 KDE、GNOME 或其他 DE 库。

【问题讨论】:

  • 问题应该迁移到 askubuntu
  • @Viswanathan:“Linux”不是 Ubuntu(当然,这就是为什么拥有一个单独的 askubuntu 站点是愚蠢的,但我离题了)
  • /dev/disk/by-id/usb-* 是当前连接的所有 USB 大容量存储设备。
  • 这不是 Ubuntu 特定的问题。我一直在寻找编程库解决方案,但无论如何我都可以使用 Python os 模块来列出具有 Ignacio Vazquez-Abrams 解决方案的设备。
  • 我也在编写一个 Python 脚本,它需要找到一个特定的 USB 驱动器。这似乎是一个在此问题上寻求和获得帮助的完全合理的地方。

标签: python linux usb removable-storage


【解决方案1】:

我认为一个好主意是使用 python 中的udev interface

小例子(当然在你的情况下你已经调整了一些过滤):

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】:

    过了这么久,问题又被解锁了……

    最后我通过 D-Bus 接口使用了 UDisk,如图所示here

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        这是我在 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"'

        【讨论】:

          【解决方案5】:

          有什么理由不只解析来自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 或一些 usb 模块进行 perl,而不是解析 ls 命令。
          • 当然 perl 和 python 都有用于此目的的模块,lsusb 的输出仍然有效并且可以快速完成工作。与往常一样,所采用的严谨程度取决于作者和他/她的任务。
          猜你喜欢
          • 2015-11-21
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 2013-03-06
          • 2013-01-29
          • 2012-08-07
          • 1970-01-01
          • 2011-11-26
          相关资源
          最近更新 更多