使用 Bash 脚本访问 USB 设备

使用 Bash 脚本访问 USB 设备

我正在使用 Raspberry Pi 4 Model B。我正在尝试制作一个在插入 USB 设备时自动运行的脚本。它将尝试从 USB 设备上的文本文件中读取。

这就是我迄今为止所取得的成就。 USB 触发一个udev运行我的脚本的事件。该脚本具有 root 权限。当它被执行时,它将ls /media/username在任何已安装的设备之后运行。

这是我遇到一些问题的地方。该脚本(由事件执行时udev)找不到我的 USB 设备。但当我手动执行该脚本时,它会起作用。因此,脚本不会失败(我使用绝对路径,并且没有环境变量),当我在终端中键入命令等时,所有命令都有效。我认为这是一个许可问题,但我可能是错的。

答案1

让我提出一个替代解决方案,而不是禁用私有挂载命名空间(添加该命名空间是为了udev弥补安全漏洞):

首先,创建一个与您的设备匹配的 udev 规则并向TAG+="systemd"其添加 。这将告诉udev您将设备称为systemd一个*.device单元。

默认情况下,单元的名称将与设备的 sysfs 路径匹配,斜杠替换为破折号,即如果ttyS0出现在/sysas中/sys/devices/pnp0/00:01/tty/ttyS0,则相应的设备单元将显示为sys-devices-pnp0-00:01-tty-ttyS0.device。如果该名称对您来说不方便,请添加ENV{SYSTEMD_ALIAS}+="<desired device unit name>"来创建您可以决定的第二个名称。

别名仍将经历斜杠到破折号的过程,因此如果您想要类似的东西sys-subsystem-media-devices-somename.device(类似于其他子系统已经做的事情),您可以指定ENV{SYSTEMD_ALIAS}+="/sys/subsystem/media/devices/somename".

一旦设备*.device在 中显示为适当命名的单元systemd,您就可以将自定义脚本作为指定 的服务WantedBy="sys-subsystem-media-devices-somename.device",从而在设备出现时启动该 systemd 单元。如果您的脚本不需要 root 访问权限并且应该仅在有登录用户时运行,您甚至可以将其设为用户服务/etc/systemd/user/*.service,即为所有用户定义,或~/.config/systemd/user/*.service仅为特定用户定义。

或者,您也可以通过在 udev 规则中指定以下之一来在 udev 规则中提供服务依赖项:

  • ENV{SYSTEMD_WANTS}="<system service to start on hotplug>.service"
  • ENV{SYSTEMD_USER_WANTS}="<user service to start on hotplug>.service"

这为您提供了多种在 udev 规则和服务之间分配职责的方法,具体取决于您的软件的模块化程度以及您希望它对用户的可选程度:

  • 如果将其指定为对系统服务的依赖项,则无论是否有任何用户登录,该服务都会被触发,并且如果要禁用它,则需要屏蔽或卸载该服务(具有root权限)。
  • 如果将其指定为udev指定的对用户服务的依赖,则用户可以选择是否允许该服务运行,而无需root权限自行更改;与所有用户的默认用户服务一起,这将为个人用户提供选择退出机制。
  • 如果您仅在 udev 规则中指定用于设备单元创建的 udev 选项,则它允许服务选择在设备出现时自动启动。如果您希望服务部件可独立更新,这可能很有用。

相关内容