Mac OSX获得USB供应商ID和产品ID

Sce*_*eik 7 macos bash usb

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

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

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

gho*_*oti 18

你标记了你的问题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 )
Run Code Online (Sandbox Code Playgroud)

这取决于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);}
    '
Run Code Online (Sandbox Code Playgroud)

或者甚至避免将它完全包裹在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)}
  }

}
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以从system_profilerXML格式获取输出:

$ system_profiler -xml SPUSBDataType
Run Code Online (Sandbox Code Playgroud)

但是,您需要一个XML解析器来处理该输出.你会发现在本机bash中解析XML需要做很多工作.


Mar*_*ell 6

根据您对信息的处理方式,您可以查看System Information.

点击Apple菜单屏幕的左上角,About this Mac,More Info,System Report并选择Hardware在左上角,然后USB.

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


Mar*_*ell 5

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

system_profiler -detailLevel full
Run Code Online (Sandbox Code Playgroud)

并从中解析输出。或者您可以将 -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
Run Code Online (Sandbox Code Playgroud)

关于 USB 设备的路径,我不知道你会如何在 Mac 上做到这一点。我可能会想跑:

find /dev -type b -o -type c
Run Code Online (Sandbox Code Playgroud)

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