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

Macos Mac OSX获取USB供应商id和产品id,macos,bash,usb,Macos,Bash,Usb,我是MacOSX世界的新手,我必须编写一个脚本,该脚本为我提供已连接usb设备的供应商id和产品id。我在Windows和Linux上做过,但在Mac上我不知道从哪里开始 我已经看到了这一点,但与示例的链接不起作用。你们对我从哪里开始或者在哪里可以找到一些例子有什么建议吗 特别是,我应该使用哪种语言?根据您想要对信息执行的操作,您可以在系统信息中查找它 单击屏幕左上角的Apple菜单、关于此Mac、更多信息、系统报告,选择左上角的硬件,然后选择USB 您可以编写Applescript来实现这一点

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

我已经看到了这一点,但与示例的链接不起作用。你们对我从哪里开始或者在哪里可以找到一些例子有什么建议吗


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

根据您想要对信息执行的操作,您可以在系统信息中查找它

单击屏幕左上角的
Apple
菜单、
关于此Mac
更多信息
系统报告
,选择左上角的
硬件
,然后选择
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设备并保存输出之前。然后让用户插入设备并再次运行相同的命令,以查看插入设备后添加了哪些设备特殊文件。也许粗糙,也许有效-只是一个想法。

你用
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 )
甚至避免将其完全包装在外壳中:

#!/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\u profiler
获取XML格式的输出:

$ system_profiler -xml SPUSBDataType

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

您在Linux等系统中使用了什么语言。我认为C是一个很好的起点。基于Linux/OSX Unix RooSi,使用C语言进行Linux和C++的Windows操作,但我也可以使用其他语言。我需要一个脚本,它给了USB路径,返回了设备的供应商ID和产品ID。我需要独立的信息(我不必与设备交互)
#!/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 SPUSBDataType