python - 在 Linux 中编写 USB 设备挂载脚本的更好方法

标签 python linux usb

我正在为与用户提供的 USB 内存棒交互的设备编写 python 模块。用户可以在设备的 USB 插槽中插入 USB 内存棒,设备会自动将数据转储到内存棒上,而无需用户干预。如果设备在用户插入 USB 内存棒时正在运行,我已经连接到 D-Bus 并完成了自动安装例程。新的问题是,如果在设备断电时插入棒子怎么办?在设备开机后,我没有收到 D-Bus 插入事件,也没有收到有关内存棒的任何相关信息 block 。

我找到了一种通过调用/proc 中的 USB 设备来获取设备节点 (/dev/sd?) 的方法:

ls /proc/scsi/usb-storage

如果您对该文件夹中的每个文件进行 cat,这将提供 scsi 设备信息。

然后我从 usb 存储记录中获取供应商、产品和序列号字段,生成一个标识符字符串,然后在

ll /dev/disc/by-id/usb_[vendor]<code>_[product]</code>_[serial_number]-0:0

所以我可以通过结果解析得到相对路径

../../sdc

然后,我可以挂载 U 盘了。

这是一个繁琐的过程,几乎都是基于文本的,当有人引入奇怪的字符或非标准的序列号字符串时,就会出现错误。它适用于我拥有的所有 2 个 USB 内存棒。我试图映射/var/log/messages 的输出,但最终也是文本比较。 lsusb、fdisk、udevinfo、lsmod 等的输出仅显示所需数据的一半。

我的问题:在没有 D-Bus 消息的情况下,我如何确定分配给 USB 内存棒的/dev 设备而不需要用户干预,或者事先知道插入设备的具体信息?

谢谢,对小说感到抱歉。

最佳答案

这似乎可以结合 /proc/partitions 和 ephimient 采用的 /sys/class/block 方法。

#!/usr/bin/python
import os
partitionsFile = open("/proc/partitions")
lines = partitionsFile.readlines()[2:]#Skips the header lines
for line in lines:
    words = [x.strip() for x in line.split()]
    minorNumber = int(words[1])
    deviceName = words[3]
    if minorNumber % 16 == 0:
        path = "/sys/class/block/" + deviceName
        if os.path.islink(path):
            if os.path.realpath(path).find("/usb") > 0:
                print "/dev/%s" % deviceName

我不确定它的便携性和可靠性如何,但它适用于我的 U 盘。当然find("/usb")可以做成更严谨的正则表达式。执行 mod 16 也可能不是查找磁盘本身和过滤掉分区的最佳方法,但到目前为止它对我有用。

关于python - 在 Linux 中编写 USB 设备挂载脚本的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384290/

相关文章:

linux - BASH 通过 PCI ID 查找 USB 驱动器连接到哪个端口

jquery - 如何让 jQuery 和 Python 在 GAME 应用程序中来回发送数据

python - True 和 [] 的输出

windows - Windows 上的 Git : What do the crlf settings mean?

默认 AWS 私有(private)主机名的正则表达式

windows - 适用于 Windows 的虚拟 USB 设备?

android ADK - USB OTG(主机模式)

python - 从 Nose2 插件跳过单元测试

python - 使用 Python 从直接 URL 下载视频

linux - 使用 airmon-ng 收听特定 channel