文字列記述子を読み取るような単純なことはできません。これはpyusbラッパーを使用した簡単なコードです(コードを簡単にするためだけです)が、元のlibsubライブラリでも問題は残ります。
import usb.core
import usb.util
devs = usb.core.find(find_all=True)
for dev in devs:
try:
print usb.util.get_string(dev, 255, dev.iManufacturer)
except usb.core.USBError:
pass
ルート権限なしでこれを実行すると、何も得られません (すべてのループ反復で例外が発生します)。ルート権限で実行すると、文字列記述子と例外が発生します。この場合、パイプエラーはデバイスが文字列記述子を提供しないことを意味するため、例外は正常であることがわかります。
問題は、ルート権限なしで文字列記述子を取得するにはどうすればよいかということです。コマンドlsusb
はすべての情報を取得し、suid ビットを有効にせずに実行します。