1

文字列記述子を読み取るような単純なことはできません。これは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 ビットを有効にせずに実行します。

4

1 に答える 1

1

私もその問題に遭遇しました。次の抜粋に見られるように、pyusb はデフォルトでデバイスを読み取り/書き込みでlsusb開き、読み取り専用で開くようです。$ strace lsusb

...
open("/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1:1.0/uevent", O_RDONLY|O_CLOEXEC) = 6
...

すべての USB デバイスを誰でも読み取り/書き込み可能にすることで問題を解決しましたが、セキュリティの観点 (キーロガーなど) からは最適ではありません...

于 2013-09-09T10:03:03.273 に答える