Airport -s -x returns truncated output

airportNetworkplistwifixml

I am the author of wifi-wand, a Ruby command line utility that can be used as a simple way to manage the Mac's WiFi (https://github.com/keithrbennett/wifiwand) without having to learn all the different underlying Mac OS commands and their options.

To get a list of network names, I used to use airport -s but found that it does not work because since the network names are right justified (left padded), there is no way to know if leading spaces are part of the name or just there for formatting. So I use airport -s -x to get the information displayed in (pseudo-)XML.

This almost always works, but I've noticed in several locations, if there is an HP printer network, the output terminates somewhere in that element. For example:

           <key>SSID_STR</key>
           <string>DIRECT-0E-HP OfficeJet 4650</string>
           <key>WPS_PROB_RESP_IE</key>
            <dict>
                    <key>IE_KEY_WPS_AP_SETUP_LOCKED</key>
                    <true/>
                    <key>IE_KEY_WPS_CFG_METHODS</key>
                    <integer>0</integer>
                    <key>IE_KEY_WPS_DEV_NAME</key>
                    <string>DIRECT-0E-HP OfficeJet 4650</string>
                    <key>IE_KEY_WPS_DEV_NAME_DATA</key>
                    <data>
                    RElSRUNULTBFLUhQIE9mZmljZUpldCA0NjUw
                    </data>
                    <key>IE_KEY_WPS_MANUFACTURER</key>
                    <string>HP</string>
                    <key>IE_KEY_WPS_MODEL_NAME</key>
                    <string>OfficeJet 4650 series

Without the -x option, the output works, but, as I say, there is the space issue that prevents me from relying on it:

                        SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
                NETGEAR25-5G a0:04:60:1a:5a:89 -67  153,-1  Y  -- WPA2(PSK/AES/AES) 
 DIRECT-0E-HP OfficeJet 4650 ac:e2:d3:a9:d9:0f -90  6       Y  -- WPA2(PSK/AES/AES) 
                      iPhone b2:8d:6c:9f:dd:00 -49  1       Y  US WPA2(PSK/AES/AES) 
                   NETGEAR25 a0:04:60:1a:5a:87 -62  9       Y  -- WPA2(PSK/AES/AES) 
                   CBCI-4F58 60:3d:26:57:4f:5c -86  6       Y  -- WPA2(PSK/AES/AES) 

What's going on and how can I fix this? Thanks in advance.

(The Github issue is at https://github.com/keithrbennett/wifiwand/issues/20.)

This HP related error is confirmed at https://clburlison.com/macos-wifi-scanning/, which says:

When you run airport with the –xml flag the command would fail to output properly formatted xml data…one idea is that HP printers are broadcasting a SSID with unsafe characters…

[which is close, but it is the model name, not the SSID, that seems to generate the error]

Best Answer

Building off of the idea of trying to match the BSSID and removing that to the end of the line, I came up with this:

airport -s \
| sed 's# ..:..:..:..:..:.. .*##g ; s#^ *##g ; 1,1d' \
| sort -u

The sed line is actually 3 part:

  1. Match the BSSID by looking for 2 characters separated by colons, repeated 5 times, and then everything to the end of the line (.*)

  2. Match from the beginning of the line (^) and then any number of spaces (.*)

  3. Deleted the first line (1,1d) which has the header information we don't care about: "SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)"

The sort -u line makes sure each SSID only shows up once.

Maybe it's not ideal, but it might be an option.

The only possible "gotcha" I can think of is that I think sometimes BSSIDs can be reduced to 1 character instead of 2 if the first character is a zero, but I'm not sure if airport does that, and none of the networks I have access to include a zero in them, so I can't test for it. Maybe someone who is better at regexes can suggest a better one that what I have.