我正在编写一个python脚本,它使用psutil包来检测USB设备何时插入计算机。但是,我还想检测设备是否已插入但未挂载。
我正在阅读文档,并假设像current_state = psutil.disk_partitions(all=True)
这样的东西会做类似这样的事情,但是经过进一步的检查,似乎并非如此。
有没有其他方法可以让psutil检测未挂载的设备?如果失败,是否有系统不可知的方式/包来检测设备是否已插入但未挂载?
发布于 2017-10-09 01:13:21
列出未挂载的块设备依赖于操作系统:这样做的机制在MacOS和Linux之间并不常见,而且目前,psutil
库没有在这些差异上实现抽象层。
列出Linux上的所有块设备
以下迭代器将生成Linux上的块设备列表,不包括那些具有分区的块设备(对于这些分区,您可能只想检查分区本身是否已挂载),以便可以将结果与挂载到挂载点的设备列表进行比较:
import glob
def linux_block_devices():
for blockdev_stat in glob.glob('/sys/block/*/stat'):
blockdev_dir = blockdev_stat.rsplit('/', 1)[0]
found_parts = False
for part_stat in glob.glob(blockdev_dir + '/*/stat'):
yield blockdev_stat.rsplit('/', 2)[-2]
found_parts = True
if not found_parts:
yield blockdev_dir.rsplit('/', 1)[-1]
列出MacOS上的所有数据块设备
在MacOS上,我不知道有一个面向编程用途的接口暴露给Python --您可能最终解析命令行输出,如下所示:
import subprocess, re
def mac_block_devices():
output = subprocess.check_output(['diskutil', 'list'])
return re.findall('^\s+\d+:.*\s(disk\S*)$', output, flags=re.MULTILINE)
...this one更粗糙,因为它不排除有孩子的设备;把这当作是读者的练习。
将以上任一项与psutil
结合使用
import os, psutil
all_block_devices = set(
linux_block_devices() if os.path.exists('/sys') else mac_block_devices()
)
used_block_devices = set(
(p.device.replace('/dev/', '') for p in psutil.disk_partitions())
)
unused_block_devices = all_block_devices - used_block_devices
上面的代码将为您提供任一操作系统上未使用的块设备的列表--类似于MacOS上的set(['sdb1', 'sdc1']) on Linux, or set(['disk3', 'disk4s1'])
。
请注意,这是“未使用”的意思,即“未在挂载表中使用”。在挂载表中不存在块设备的情况下,还有其他几种方法可以使用(应用程序代码直接原始访问;使用交换分区;存在于设备映射器或逻辑卷机制的后备中;等等),检测所有这些都需要对任一操作系统进行大量连接。
发布于 2018-05-04 04:12:44
我最近在OSX上解决了这个问题,也可能在*nix上(等待进一步的测试)使用hidapi
。下面是我如何使用它的一个示例:
import hid
import pprint
hid_state = hid.enumerate()
pprint.pprint(hid_state)
输出如下:
[ {'interface_number': -1,
'manufacturer_string': 'Apple Inc.',
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Apple Internal Keyboard@0/AppleUSBTCKeyboard@14400000,0',
'product_id': 610,
'product_string': 'Apple Internal Keyboard / Trackpad',
'release_number': 549,
'serial_number': '',
'usage': 6,
'usage_page': 1,
'vendor_id': 1452},
{'interface_number': -1,
'manufacturer_string': 'Apple Inc.',
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Touchpad@1/AppleUSBMultitouchDriver@14400000,1',
'product_id': 610,
'product_string': 'Apple Internal Keyboard / Trackpad',
'release_number': 549,
'serial_number': '',
'usage': 1,
'usage_page': 65280,
'vendor_id': 1452},
{'interface_number': -1,
'manufacturer_string': 'Apple Inc.',
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Touchpad@2/AppleUSBTCButtons@14400000,2',
'product_id': 610,
'product_string': 'Apple Internal Keyboard / Trackpad',
'release_number': 549,
'serial_number': '',
'usage': 2,
'usage_page': 1,
'vendor_id': 1452},
{'interface_number': -1,
'manufacturer_string': '',
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/PEG1@1,1/'
b'IOPP/UPSB@0/IOPP/DSB1@3/IOPP/UPS0@0/IOPP/pci-bridge@0/IOPP/pci1b'
b'73,1100@0/AppleUSBXHCIFL1100@00000000/AppleUSB20XHCIPort@0040000'
b'0/USB Keyboard@00400000/IOUSBHostInterface@1/IOUSBHostHIDDevice@'
b'00400000,1',
'product_id': 617,
'product_string': 'USB Keyboard',
'release_number': 4368,
'serial_number': '',
'usage': 1,
'usage_page': 12,
'vendor_id': 1241},
{'interface_number': -1,
'manufacturer_string': '',
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/HDEF@1B/A'
b'ppleHDAController@1B/IOHDACodecDevice@1B,0/IOHDACodecDriver/IOHD'
b'ACodecFunction@1B,0,1/AppleHDACodecGeneric/AppleHDADriver/AppleM'
b'ikeyHIDDriver',
'product_id': 0,
'product_string': 'Apple Mikey HID Driver',
'release_number': 0,
'serial_number': '',
'usage': 1,
'usage_page': 12,
'vendor_id': 0}]
为简洁起见,此示例已简化,但面临的一个问题是同一设备的多个条目,其中仅路径略有不同,示例如下所示:
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Touchpad@2/AppleUSBTCButtons@14400000,2',
与
'path': b'IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/XHC1@14/X'
b'HC1@14000000/HS12@14400000/Apple Internal Keyboard / Trackpad@14'
b'400000/Apple Internal Keyboard@0/AppleUSBTCKeyboard@14400000,0',
我能够通过使用路径值减去最后一个字符对字典列表进行排序来删除这些重复项(因为许多只以不同的",number“结尾),如下所示:
list({str(v['path'][:-2]): v for v in r}.values())
正如我已经提到的,我仍然需要在*nix上做测试,然而,我可以说它在识别OSX上的鼠标和键盘等HID设备方面做得很好,我需要确定它是否能够识别恶意HID设备,如USB Rubber Duckies,但迹象看起来很好。
https://stackoverflow.com/questions/46637328
复制相似问题