我是Mac OSX世界的新手,我必须编写一个脚本,它给出了连接的USB设备的供应商ID和产品ID。我已经为Windows和Linux做过,但对于Mac我不知道从哪里开始。
我见过这个post但是与示例的链接不起作用。你们有什么建议我可以从哪里开始或在哪里可以找到一些例子?
特别是,我应该使用哪种语言?
答案 0 :(得分:17)
您使用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中举重而不是纯粹的猛击:
#!/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);}
'
甚至避免将它完全包装在shell中:
#!/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)}
}
}
请注意,您还可以使用XML格式从system_profiler
获取输出:
$ system_profiler -xml SPUSBDataType
但是,您需要一个XML解析器来处理该输出。而且你会发现在本机bash中解析XML需要做很多工作。
答案 1 :(得分:6)
根据您对信息的处理方式,您可以在System Information
中查找。
点击屏幕左上角的Apple
菜单,About this Mac
,More Info
,System Report
并选择左上角的Hardware
,然后{{1} }。
你可以编写Applescript来做到这一点,但是如果你要以某种方式继续与设备交互,这可能不是最好的方法。
答案 2 :(得分:4)
您可以使用system_profiler命令,如下所示:
system_profiler -detailLevel full
并解析其中的结果。或者,您可以将-xml选项添加到system_profiler命令,并使用awl / 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设备之前,保存输出。然后让您的用户插入设备并再次运行相同的命令,以查看因插入设备而添加了哪些设备专用文件。也许粗糙,也许有效 - 只是一个想法。