草庐IT

linux - 禁用特定的USB设备

coder 2023-06-22 原文

我需要在linux(准确地说是debian)中编写一个程序,如果未通过特定的过滤器,则会禁用USB设备。例如,该程序可能设置为禁止网络摄像头,usb棒和键盘,启用鼠标和打印机(通过usb)。筛选器可能会在运行时更改。例如,该程序可能会收到一条消息,指示启用USB内存棒,并且该程序应该响应而无需重新启动系统。该程序是用python编写的,但也可以嵌入c代码(或其他代码)。

我尝试过的

我尝试了许多方法,但其中一些与编程无关。

首先,我试图弄乱udev。插入设备后,我可以监视 Activity 并编写过滤器。过去有一个选项“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的符号链接(symbolic link))。一些文档告诉我,该文件夹包含设备的设置,将/power/level设置为“关闭”或“挂起”会关闭设备的电源。但是我无法操纵/power中的任何文件。想一想,毕竟这可能不是一个好主意。

问题

因此,问题是,完成这项任务的最佳方法是什么?我有一个主意,但是我不确定它是否会起作用,即使它起作用,也可能会过大。我的想法是编写“包装程序驱动程序”,将其自身标识为Linux内核,作为所有USB设备的驱动程序。 “包装程序驱动程序”读取设备信息,如果设备运行良好,它将充当内核中实际驱动程序的包装程序,并调用其功能。如果没有,“包装程序驱动程序”将忽略该设备。

我不确定它是否可以完成,我没有内核或驱动程序编程经验。

另一种方法是-以某种方式-以编程方式获取设备的句柄并告诉其关闭电源(或使设备永远处于繁忙状态,无论如何工作)。我也做了一些小研究,但找不到合适的方法。他们说所有设备都被视为"file",但我根本无法访问这些文件。

注意:
问题主要与linux内部有关,但也涉及内核编程。我阅读了很多有关USB操作/监控程序的信息,阅读了udevadm的手册页。但是这些方法根本对我没有帮助。我想我需要以编程方式更改内核或设备内部。

我也尝试过处理authorized(用于键盘)中的/sys/devices/pci0000:00/0000:00:14.0/usb1/1-4文件。它的默认值为1。将其更改为0会成功禁用总线(不是设备,而是物理USB端口。插入另一个端口后仍可以使用同一设备)。但是将其设置为0也会停止此USB端口发出的udev事件。因此,如果用户插入了禁止的设备,则可以禁用该端口,但是由于无法收听udev中的remove事件,因此我无法决定何时启用该端口。如果我深入研究较低级别的代码(可能是内核)并以其他方式监听USB事件是否有意义?

最佳答案

我认为解决问题的最简单方法是将除鼠标,键盘等之外的所有USB设备驱动程序列入黑名单。
最干净的方法是使用USB设备ID将udev的鼠标等列入白名单

关于linux - 禁用特定的USB设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20682088/

有关linux - 禁用特定的USB设备的更多相关文章

  1. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  2. Ruby - 如何在读取文件时跳过/忽略特定行? - 2

    在读取/解析文件(使用Ruby)时忽略某些行的最佳方法是什么?我正在尝试仅解析Cucumber.feature文件中的场景,并希望跳过不以Scenario/Given/When/Then/And/But开头的行。下面的代码有效,但它很荒谬,所以我正在寻找一个聪明的解决方案:)File.open(file).each_linedo|line|line.chomp!nextifline.empty?nextifline.include?"#"nextifline.include?"Feature"nextifline.include?"Inorder"nextifline.include?

  3. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  4. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  5. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  6. ruby-on-rails - Ruby on Rails - 需要在每周的特定时间将消息发送到电子邮件 - 2

    我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用ruby​​onrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_

  7. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  8. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

  9. ruby - 根据要求使用特定的 VCR 磁带 - 2

    情况:使用Rspec、FactoryGirl和VCR测试Rails应用程序。每次创建用户时,都会通过Stripe的API创建关联的Stripe客户。测试时,添加VCR.use_cassette或describe"...",vcr:{cassette_name:'stripe-customer'}do...到涉及用户创建的每个规范。我的实际解决方案如下:RSpec.configuredo|config|config.arounddo|example|VCR.use_cassette('stripe-customer')do|cassette|example.runendendend但这是

  10. ruby - 从特定索引开始迭代数组 - 2

    我想从特定索引开始遍历数组。我该怎么做?myj.eachdo|temp|...end 最佳答案 执行以下操作:your_array[your_index..-1].eachdo|temp|###end 关于ruby-从特定索引开始迭代数组,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/44151758/

随机推荐