我需要在linux(debian,确切地说)中编写一个程序,如果它没有通过特定的过滤器,它会禁用USB设备。例如,程序可能设置为禁用网络摄像头,USB棒和键盘,启用鼠标和打印机(通过USB)。过滤器可能会在运行时更改。例如,程序可能会收到一条消息来启用usb stick,它应该在不重新启动系统的情况下响应。该程序是用python编写的,但嵌入c代码(或其他代码)也是可以接受的。
我尝试了什么
我尝试了很多方法,但有些方法不是编程方法。
首先,我试图弄乱udev。我可以监控设备插入时的活动并写入过滤器。曾经有一个忽略过滤设备的选项“ignore_device”。例如,要忽略作为usb子系统成员的所有设备,我会将其写为udev规则:
ACTION=="add", SUBSYSTEM=="usb", OPTIONS+="ignore_device"
但是此选项在udev的this版本中发布。到目前为止,我得到的是udev目前主要用于监控。当然,我可以为运行脚本的上述规则编写其他规则,但我必须在其他地方执行禁用。
其次,我尝试了ioctl向设备句柄发送DISCONNECT信号。我正在用USB鼠标测试它。这是python的代码:(我也在C中试过这个,没有改变)
import fcntl
import sys
USBDEVFS_RESET = ord('U') << (4*2) | 20
USBDEVFS_DISCONNECT = ord('U') << (4*2) | 22
raw_name = "/dev/bus/usb/{:03d}/{:03d}"
filename = raw_name.format(1,2)
fd = open(filename, "wb")
fcntl.ioctl(fd, USBDEVFS_DISCONNECT, 0)
在这里,如果我发送USBDEVFS_RESET,它可以工作,鼠标输入会被忽略一两秒。但断开信号会引发错误:
IOError: [Errno 25] Inappropriate ioctl for device
我从这里得到的是,我无法向鼠标发送断开信号。也许一个usb棒或打印机或其他一些设备可以工作,我还没试过。我想尽可能地开发通用程序,以防止编写其他特定于设备的代码,因此这种方法对我来说似乎毫无用处。另一点是当我手动断开/连接鼠标时,我在udev监视器中看到了事件。但是当我发送重置信号时,不会发送任何事件。
udev监视器说鼠标已安装到此路径:/sys/bus/usb/devices/1-3
(这是/sys/devices/pci0000:00/0000:00:14.0/usb1/1-3
的符号链接)。有些文件告诉我,此文件夹包含设备的设置,设置/电源/电平为“关闭”或“暂停”会关闭设备电源。但是我无法操纵/ power中的任何文件。来考虑一下,毕竟这可能不是一个好主意。
问题
所以,问题是,实现这样的任务的最佳方法是什么?我有一个想法,但我不确定它是否会起作用,即使它确实有效,也可能有点过分。我的想法是写一个“包装驱动程序”,它将自己标识为linux内核,作为所有usb设备的驱动程序。 “包装器驱动程序”读取设备信息,如果设备是好的,它可以作为内核中真实驱动程序的包装器,调用它们的功能。如果没有,“包装驱动程序”就会忽略该设备。
我不确定它是否可以完成,我在内核或驱动程序编程方面没有经验。
另一种方法是,以某种方式获取设备的句柄,并告诉它关闭电源(或让它永远忙碌,无论什么工作)。我也做了一些研究,但找不到一个简单的方法。他们说所有设备都被视为“文件”,但我根本无法访问这些文件。
注意: 问题主要是关于linux内部,但它也涉及内核编程。我读了很多关于USB操作/监控程序的内容,我阅读了udevadm的手册页。但这些方法对我没有任何帮助。我想我需要以编程方式改变内核或设备内部。
我还尝试操作驻留在authorized
中的/sys/devices/pci0000:00/0000:00:14.0/usb1/1-4
文件(用于键盘)。它的默认值为1.将其更改为0成功禁用了总线(非设备,但物理USB端口。插入另一个端口时仍可使用相同的设备)。但是将它设为0也会阻止来自这个USB端口的udev事件。因此,如果用户插入禁用设备,我可以禁用该端口,但我无法决定何时启用它,因为我无法在udev中收听remove
个事件。如果我深入研究较低级别的代码(可能是内核)并以其他方式监听usb事件,这是否有意义?
答案 0 :(得分:1)
我认为解决问题的最简单方法是将除鼠标,键盘等之外的所有usb设备驱动程序列入黑名单。
最干净的方法是使用usb device id's
将udev列入鼠标等答案 1 :(得分:0)
编写包装器驱动程序是一种绝对的矫枉过正,从未选择过这种方式。
一种可能的解决方案可能是将usb访问权限与用户权限联系起来。这是一个相关的链接,你可能会找到方便的
http://robots.mobilerobots.com/wiki/Linux_udev_USB_Device_Permissions_Configuration