usbtop
permet de surveiller l'activité des ports USB. Comme iotop
permet de visualiser celle des supports de stockage et logtop
celle de fichiers (de journaux, souvent). Je l'ai découvert ici.
Cet outil est empaqueté dans Debian GNU/Linux depuis sa version 10 / Buster.
Avant de l'utiliser, il faut charger le module noyau « usbmon » : sudo modprobe usbmon
. Sinon, on se mange l'erreur « No USB bus can be captured thanks to libpcap. Check your name filter and make sure relevent permissions are set ! ».
Ne pas oublier de décharger le module après usage (motifs : sécurité et propreté) : sudo rmmod usbmon
.
Pour voir ce qui circule sur un bus USB, on peut utiliser les indispensables tshark
et wireshark
puisque la libpcap sur laquelle ils reposent permet la capture USB.
Comme pour usbtop
, il faut charger le module noyau « usbmon » au préalable.
Ensuite, il faut identifier le bus sur lequel est connecté le périphérique USB que l'on veut écouter avec lsusb -t
. Il faudra écouter sur l'interface usbmon correspondante. Exemple : bus 2 = interface « usbmon2 ».
Mais wireshark
et tshark
m'envoient bouler lorsque je veux écouter sur l'interface en question : « The capture session could not be initiated on interface 'usbmon2' (You don't have permission to capture on that device). Please check to make sure you have sufficient permissions ». Pourtant, mon utilisateur est bien dans le groupe wireshark depuis fort longtemps.
Solution : sudo setfacl -m u:$USER:r /dev/usbmon*
. Évidemment, il faudra refaire cette manip' à chaque chargement du module usbmon (la modif' n'est pas permanente, et, vu ce qu'elle permet, je pense que c'est mieux ainsi).
Que ce soit avec tshark
ou avec wireshark
, Il n'est pas possible d'utiliser des filtres de capture, mais uniquement des filtres d'affichage. Liste des filtres d'affichage applicables à une capture USB.
Exemple : si l'on veut afficher le trafic d'un seul périphérique sur un bus qui en raccorde plusieurs, disons le périphérique qui a l'identifiant 23 sur le bus 2 (d'après lsusb -t
), le filtre est « usb.addr == "2.23.1" ». Attention : ne surtout pas oublier les guillemets autour de l'adresse sinon aucun paquet sera affiché !
Attention : certains périphériques, comme les périphériques de stockage, utilisent plusieurs endpoints. Ainsi, si un disque dur externe USB a l'identifiant 23 sur le bus 2, utiliser un filtre « usb.addr == "2.23.1" » masquera une partie des échanges. Pour tout voir, il faut utiliser le filtre « usb.device_address == 23 ». Même source.
Je constate qu'il vaut mieux utiliser le filtre « usb.device_address » par rapport au filtre « usb.addr ».
Mode d'emploi tshark :
tshark -D
;tshark -i <identifiant_mémorisé_à_l'étape_précédente>
;tshark -i <identifiant_mémorisé_à_l'étape_précédente> -Y 'usb.device_address == 23'
.
Lors de l'utilisation d'une souris, on voit des messages « URB_INTERRUPT » à chaque mouvement / clic. Lors d'une lecture de fichiers sur un périphérique de stockage, on voit des « SCSI: Read(16) LUN ». Et des « SCSI: Write(16) LUN » lors d'une écriture. Et sur une clé USB (uniquement), on voit des « SCSI: Test Unit Ready LUN » toutes les deux secondes d'inactivité. Amusant. :)