Utilicé la salida de ioreg
y agregué un poco de análisis con perl para producir un archivo csv de puertos seriales en relación a la información usb (como VID, PID, SN).
ioreg -r -c IOUSBHostDevice -x -l | perl -ne 'BEGIN {print "Número de serie USB,idProducto,idVendedor,Dispositivo de Llamada IO\n"} /"Número de serie USB" = "(.+)"/ && ($sn=$1); /"idProducto" = (.+)/ && ($ip=$1); /"idVendedor" = (.+)/ && ($iv=$1); /"Dispositivo de Llamada IO" = "(.+)"/ && print "$sn,$ip,$iv,$1\n"'
Ejemplo de salida:
Número de serie USB,idProducto,idVendedor,Dispositivo de Llamada IO
123456,0x1234,0xaabb,/dev/cu.usbmodem1234561
987654,0xabcd,0xaabb,/dev/cu.usbmodem9876542
000001,0x4321,0xccdd,/dev/cu.usbmodem0000013
Esta salida se puede analizar fácilmente o usar en conjunto con grep
para encontrar el dispositivo deseado y puerto serie
Explicación:
ioreg -r -c IOUSBHostDevice -x -l
lista dispositivos usb host, usa -x
para una salida hexadecimal
perl -ne
para analizar la salida de ioreg, -n
itera sobre la salida línea por línea, -e
ejecuta el comando especificado
BEGIN {print "Número de serie USB,idProducto,idVendedor,Dispositivo de Llamada IO\n"}
imprime la cabecera csv
/"Número de serie USB" = "(.+)"/ && ($sn=$1);
hace coincidir un patrón y almacena el valor capturado en una variable $sn
/"idProducto" = (.+)/ && ($ip=$1); /"idVendedor" = (.+)/ && ($iv=$1);
lo mismo que arriba
/"Dispositivo de Llamada IO" = "(.+)"/ && print "$sn,$ip,$iv,$1\n"
cada vez que haya una línea que contenga Dispositivo de Llamada IO sabemos que estamos tratando con un puerto serie (podrías cambiar esto a IODialinDevice
para tty
en lugar de cu
). Imprime el puerto serie e información usb almacenada más recientemente (la cual siempre viene antes en la salida de ioreg) como una línea delimitada por ,.