Mac OSX获取USB供应商id和产品id



我是Mac OSX世界的新手,我必须编写一个脚本,为我提供连接的usb设备的供应商id和产品id。我已经为Windows和Linux做过了,但对于Mac,我不知道从哪里开始。

我看过这篇文章,但与示例的链接不起作用。关于我可以从哪里开始,或者在哪里可以找到一些例子,你们有什么建议吗?

特别是,我应该使用哪种语言?

您用bash标记了您的问题,所以我会像您在bash中询问如何做到这一点一样回答它,而不是询问使用什么语言(这会使问题偏离StackOverflow的主题)。

您可以使用内置工具分析system_profiler中的现有数据。例如,这里有一个供应商的转储:产品对,带有"位置ID"和制造商。。。

#!/bin/bash
shopt -s extglob
while IFS=: read key value; do
key="${key##+( )}"
value="${value##+( )}"
case "$key" in
"Product ID")
p="${value% *}"
;;
"Vendor ID")
v="${value%% *}"
;;
"Manufacturer")
m="${value}"
;;
"Location ID")
l="${value}"
printf "%s:%s %s (%s)n" "$v" "$p" "$l" "$m"
;;
esac
done < <( system_profiler SPUSBDataType )

这取决于Location ID是每个USB设备列出的最后一项,我还没有最终验证这一点。(对我来说就是这样。)

如果你想要(1)更容易阅读,(2)不依赖bash,因此更便携的东西(虽然不是问题;所有Mac都附带bash),你可能想考虑用awk而不是纯bash:来完成繁重的工作

#!/bin/sh
system_profiler SPUSBDataType 
| awk '
/Product ID:/{p=$3}
/Vendor ID:/{v=$3}
/Manufacturer:/{sub(/.*: /,""); m=$0}
/Location ID:/{sub(/.*: /,""); printf("%s:%s %s (%s)n", v, p, $0, m);}
'

或者甚至避免将其完全包裹在外壳中:

#!/usr/bin/awk -f
BEGIN {
while ("system_profiler SPUSBDataType" | getline) {
if (/Product ID:/)   {p=$3}
if (/Vendor ID:/)    {v=$3}
if (/Manufacturer:/) {sub(/.*: /,""); m=$0}
if (/Location ID:/)  {sub(/.*: /,""); printf("%s:%s %s (%s)n", v, p, $0, m)}
}
}

注意,您还可以从system_profiler获得XML格式的输出:

$ system_profiler -xml SPUSBDataType

不过,您需要一个XML解析器来处理该输出。您会发现在原生bash中解析XML需要做大量工作。

根据您想对信息做什么,您可以在System Information中查找它。

单击屏幕左上角的Apple菜单、About this MacMore InfoSystem Report,然后选择左上角Hardware,然后选择USB

你可以写Applescript来做到这一点,但如果你要继续以某种方式与设备交互,这可能不是最好的方法。

您可以使用system_profiler命令,如下所示:

system_profiler -detailLevel full

并从中解析结果。或者,您可以将-xml选项添加到system_profiler命令中,并使用awk/grep或Perl中的xml模块非常容易地解析xml。

示例摘录:

| |   |   | +-o FaceTime HD Camera (Built-in)@0  <class IOUSBInterface, id 0x1000002b2, registered, matched, active, busy 0 (26 ms), retain 7>
| |   |   | |   {
| |   |   | |     "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
| |   |   | |     "bcdDevice" = 0x755
| |   |   | |     "IOUserClientClass" = "IOUSBInterfaceUserClientV3"
| |   |   | |     "idProduct" = 0x850b
| |   |   | |     "bConfigurationValue" = 0x1
| |   |   | |     "bInterfaceSubClass" = 0x1
| |   |   | |     "locationID" = 0xfffffffffa200000
| |   |   | |     "USB Interface Name" = "FaceTime HD Camera (Built-in)"
| |   |   | |     "idVendor" = 0x5ac

关于USB设备的路径,我不知道你会如何在Mac上简单地做到这一点。我可能很想参加

find /dev -type b -o -type c

在插入USB设备并保存输出之前。然后让用户插入设备并再次运行相同的命令,查看插入设备后添加了哪些设备专用文件。也许粗糙,也许有效——只是一个想法。

相关内容

  • 没有找到相关文章

最新更新