如何通过 MACOS cli 确定 nss(空间流数)

How to determine the nss (number of spatial streams) via MACOS cli

在 MACOS (MacBook Pro) 上,我正在尝试确定一种通过 cli 导出 wifi 空间流数量的方法。生成 wifi 详细信息的终端命令是: /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

...但是nss不是细节制作的一部分

nss 似乎只能通过 GUI 显示,方法是按住选项键并单击 wifi 图标。

目标是将其添加到我的 BASH 脚本中。

如果您将 -x 标志添加到 airport 实用程序,您将获得更详细的 XML 输出:

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I -x

示例输出

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AUTH_LOWER</key>
    <integer>1</integer>
    <key>AUTH_UPPER</key>
    <integer>8</integer>
    <key>BANDWIDTH</key>
    <integer>80</integer>
    <key>CHANNEL</key>
    <integer>100</integer>
    <key>CHANNEL_FLAGS</key>
    <integer>1040</integer>
    <key>GI</key>
    <integer>400</integer>
    <key>MCS_INDEX</key>
    <integer>3</integer>
    <key>NOISE_CTL_AGR</key>
    <integer>-93</integer>
    <key>NOISE_UNIT</key>
    <integer>0</integer>
    <key>NSS</key>                    <--- HERE IT IS
    <integer>3</integer>
    <key>RSSI_CTL_AGR</key>
    <integer>-60</integer>
    <key>RSSI_CTL_LIST</key>
    <array>
        <integer>-61</integer>
        <integer>-57</integer>
        <integer>-62</integer>
    </array>
    <key>RSSI_EXT_AGR</key>
    <integer>0</integer>
    <key>RSSI_EXT_LIST</key>
    <array>
        <integer>0</integer>
        <integer>0</integer>
        <integer>0</integer>
    </array>
    <key>RSSI_UNIT</key>
    <integer>0</integer>
</dict>
</plist>

您可以将其定向到一个文件,然后使用 PlistBuddy 解析该文件 - 虽然可能有更优雅的方式我不知道(如果有人知道请联系我):

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I -x > /tmp/airport.plist

/usr/libexec/PlistBuddy /tmp/airport.plist -c "Print :NSS"
3

似乎 PlistBuddy 拒绝读取除真实可靠文件以外的任何内容,并且不会接受 bash “处理替换” 作为输入...所以,我可以解决的唯一不使用临时文件的解决方案是:

airport -I -x | awk '/<key>NSS<\/key>/{getline; gsub(/[^0-9]/,""); print; exit}'

更新

我已经找到了一种可靠的方法,作为一个单行,没有使用 Python 的中间文件。 plistlib 模块在标准 Python 库中,因此无需安装 :-)

airport -I -x | python3 -c 'import plistlib, sys; pl=plistlib.loads(sys.stdin.buffer.read()); print(pl["NSS"])'

关键词: macOS, wifi, wi-fi, airport, airport utility, NSS, spatial streams, command-line, commandline, CLI, XML, PlistBuddy , plistlib.

plutil 是一个读取 plist 文件(- for STDIN)的工具,并以另一种格式打印它或从中提取部分信息。

示例:

转换为JSON

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I -x \
| plutil -convert json - -o -
{...,"NSS":2,...}

提取一把钥匙

/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I -x \
| plutil -extract NSS raw -
2