我正在寻找一种可靠的方法来通过脚本检测笔记本电脑是否具有触摸屏设备。我知道我可以解析以下输出:
$ xinput --list
? Virtual core pointer id=2 [master pointer (3)]
? ? Virtual core XTEST pointer id=4 [slave pointer (2)]
? ? ELAN Touchscreen id=10 [slave pointer (2)]
? ? SynPS/2 Synaptics TouchPad id=12 [slave pointer (2)]
? Virtual core keyboard id=3 [master keyboard (2)]
? Virtual core XTEST keyboard id=5 [slave keyboard (3)]
? Power Button id=6 [slave keyboard (3)]
? Video Bus id=7 [slave keyboard (3)]
? Power Button id=8 [slave keyboard (3)]
? TOSHIBA Web …
Run Code Online (Sandbox Code Playgroud) 我有一部 HTC Android 手机。
每次我将它连接到计算机时,我都会收到一条消息:
Android Phone: Could not open MTP device "[usb:002,003]"
Run Code Online (Sandbox Code Playgroud)
数字可能不同。但是手机连接正确。
usb-devices
输出
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 28 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0bb4 ProdID=0f91 Rev=02.33
S: Manufacturer=HTC
S: Product=Android Phone
S: SerialNumber=FA41BWB00560
C: #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 3 Cls=06(still) Sub=01 Prot=01 Driver=usbfs
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=00 Driver=(none)
Run Code Online (Sandbox Code Playgroud)
lsusb
Bus 007 …
Run Code Online (Sandbox Code Playgroud) 在 Ubuntu 14.04 上,我有一个长时间运行的 bash 脚本,其中有一个简单的 udev 规则,它的工作原理如下:
ACTION=="change", SUBSYSTEM=="block", RUN+="/opt/script.sh"
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 16.04 上,事情进展得并不顺利。脚本开始运行,但在它完成之前就被杀死了。然后我尝试更改我的 udev 规则以调用一个可以分离脚本的 warapper 脚本。我试过:
ACTION=="change", SUBSYSTEM=="block", RUN+="/opt/script.sh"
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
#!/bin/sh
nohup /opt/script.sh &
Run Code Online (Sandbox Code Playgroud)
无济于事。
然后我尝试创建一个 systemd 服务...
ACTION=="change", SUBSYSTEM=="block", ENV{SYSTEMD_WANTS}=="justrunthescript.service"
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/justrunthescript.service
[Unit]
Description=Just run the script
[Service]
ExecStart=/opt/script.sh
Run Code Online (Sandbox Code Playgroud)
我必须在某个时候运行脚本,但我的脚本依赖于 udev 参数,如 $ID_FS_TYPE 不会以这种方式传递。
我想我想要的很简单,只需插入一张光盘并从 udev 规则运行我的脚本,不要杀死脚本。解决这个问题的最佳方法是什么?
不,这不是为什么我的 Wi-Fi 适配器在 16.04 中不显示为 wlan0?,因为这解释了如何恢复eth0
命名,而不是如何单独命名特定接口。
我不想根据 MAC 匹配进行分配。我所需要的只是根据 USB 路径分配名称。
当我插入 USB 网络适配器时,在 Ubuntu 17.04 上,它会根据其 MAC 分配一个网络接口名称,例如encx000000000000
. 现在我想根据它的 ID_PATH= 将它重命名为更能说明问题的名称pci-000:02:03.0-usb-0:1:1.0
。特别是,我不想根据 MAC 地址进行匹配。理由是更换接口后一切都会崩溃,但如果有人简单地更换网络接口硬件,使新硬件与旧硬件在同一位置,系统将在不需要 IT 和重新配置支持的情况下继续运行。
所以我创建了一个文件/etc/systemd/network/50-my-island.link
:
[Match]
Path=pci-000:02:03.0-usb-0:1:1.0
[Link]
Name=island0
Run Code Online (Sandbox Code Playgroud)
不幸的是,该名称从未分配过。使用udevadm info
我可以看到有ID_NET_NAME=island0
设置,但它不适用。尝试NamePolicy=
或NamePolicy=name
在该[Link]
部分下也无济于事。
我迷路了!如何将 .link 文件中的名称分配给我的 USB 网络适配器?在不诉诸某些 udev 规则的情况下,这完全可能吗?当 .link 文件在我的情况下似乎不起作用时,为什么还要有 .link 文件呢?我在哪里犯了错误?
每次具有 SMART 功能的特定设备插入 USB 端口时,我都会在systemd
.conf文件中使用以下内容来运行图形对话框。zenity
这在使用显示服务器的 Xubuntu 中工作正常,但在WaylandX
服务器中对话框显示zenity
失败。
USER=myName\nDISPLAY=:0.0\nWAYLAND_DISPLAY=wayland-0\nXAUTHORITY=/home/myName/.Xauthority\nHOME=/home/myName\nSHELL=/bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n我尝试在 Ubuntu 23.10 中添加WAYLAND_DISPLAY=wayland-0
Wayland服务器的.confzenity
文件,但对话仍然无法显示。我还需要做什么?
我的setup-01的文件列表:
\n/bin/hdd_smart_dump_on_usb_trigger.sh\n/etc/00_hdd_smart_dump_on_usb_trigger.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf\n/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.target\n/etc/udev/00_hdd_smart_dump_on_usb_trigger.udev.sh\n/etc/udev/rules.d/99-hdd-smart-dump-on-usb-trigger.udev.rules\n
Run Code Online (Sandbox Code Playgroud)\n内容/etc/00_hdd_smart_dump_on_usb_trigger.conf
:
USER=myName\nDISPLAY=:0.0\nWAYLAND_DISPLAY=wayland-0\nXAUTHORITY=/home/ajthapa/.Xauthority\nHOME=/home/myName\nSHELL=/bin/bash\n
Run Code Online (Sandbox Code Playgroud)\n内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service
:
[Unit]\nDescription=HDD SMART Dump on USB Trigger - service unit for %I\nDocumentation=man:systemd.unit(5) man:systemd.exec(5) man:systemd.special(7) man:systemd.target(5)\nConditionPathExistsGlob=/sys/class/block/sd*\n# RefuseManualStart=true\n# RefuseManualStop=true\n\n[Service]\nEnvironmentFile=/etc/00_hdd_smart_dump_on_usb_trigger.conf\nExecStart=-/bin/bash -c '/bin/hdd_smart_dump_on_usb_trigger.sh -d %i -t "start_of_session"'\n
Run Code Online (Sandbox Code Playgroud)\n内容/etc/systemd/system/hdd_smart_dump_on_usb_trigger@.service.d/disable_manual_start.conf
:
[Unit]\n## Allow only to be started/stopped by …
Run Code Online (Sandbox Code Playgroud) 我试图让其他用户访问我的外部 1TB NTFS 硬盘驱动器自动安装在/media/[username]/STORAGE
问题是,默认情况下,udisk2(存在于 Ubuntu 12.10 中)会自动创建:
/media/[username]
使用 chown: root:root 和 chmod: 700/media/[username]/STORAGE
使用 chown: [username]:[username] 和 chmod: 700因此,没有其他用户可以访问它,如果 UPnP 服务器以与 [username] 不同的用户身份运行,则也不能访问它。
当然我可以,这次只是 chmod 一切,但如果我卸载并挂载,那么默认权限将重新打开,我会遇到同样的问题。
答案可能与添加权限有关,/etc/udev/rules.d/
但我不是专家。
你能帮我吗?
我遇到了 udev 规则未运行的问题。下面是一个例子:
我有一个规则/etc/udev/rules.d/99-test.rules
,其中包含:
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"
Run Code Online (Sandbox Code Playgroud)
并且sayhi
只有:
#!/bin/bash
date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi
Run Code Online (Sandbox Code Playgroud)
这是一台英特尔机器,我显然有许多供应商 0x8086 PCI 设备:
root@imtrobot:~# lspci -n |grep 8086
00:00.0 0600: 8086:2770 (rev 02)
00:02.0 0300: 8086:2772 (rev 02)
00:1d.0 0c03: 8086:27c8 (rev 01)
[ etc. 12 lines total ]
Run Code Online (Sandbox Code Playgroud)
然而,当我启动时,/saidhi
要么根本不创建,要么里面有 1 或 2 个日期行。
如果在启动后,我运行udevadm trigger --action=add --subsystem-match=pci
然后 /saidhi
将获得添加到它的正确数量的日期。
为什么这在启动过程中不起作用?
我有一个基于 libusb 的程序,无法在新安装的 Ubuntu 上打开 USB 设备,因为它缺乏权限。
这个解决方案可能适合我,但它需要手动指定每个设备 - 而且我有很多设备。所以我尝试了这个(在文件中/etc/udev/rules.d/41-cvs-permissions.rules
):
SUBSYSTEM=="usb", MODE:="0666"
Run Code Online (Sandbox Code Playgroud)
我省略了 VID 和 PID,希望它能简单地将规则应用于所有设备。它肯定有一些效果,但效果相当奇怪:libusb 现在只检测到 2 个,而不是检测到 5 个无法打开的设备 - 两者都是 USB 主机控制器,而不是实际设备。
如何实现我想要的?
我在 Windows 11 上运行 usbipd 以使 USB 设备能够连接到 WSL。这有效。我可以以 root 身份运行我的串行应用程序,并且工作正常。我宁愿不以 root 身份运行我的应用程序。我的用户在组 dialout(和 tty)中。
我无法从 root 更改 FTDI 串行端口组:
:~$ ls /dev/ttyUS* -Al
crw------- 1 root root 188, 0 May 13 08:07 /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
注意组是root,权限是188。 lsusb:
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
Bus …
Run Code Online (Sandbox Code Playgroud) 我创建了一个小示例脚本,它是我的真实脚本的简化版本,它看起来基本上如下:
#!/bin/bash
echo "start" > /home/myName/log.txt
#get list with all attached devices
for i in $(lsblk -lo name,fstype,hotplug,type|grep '1 part$'|tr -s ' ' ' '|sed 's/ 1 part$//'|grep ' ..*$'|tr ' ' '_')
do
echo $i >> /home/myName/log.txt
done
Run Code Online (Sandbox Code Playgroud)
如果我直接在终端中调用脚本,则一切正常。所以日志文件中的返回是类似的。
start
sdc1_vfat
Run Code Online (Sandbox Code Playgroud)
但是一旦从 udev 规则调用脚本,循环就不再起作用。日志文件中的输出仅
start
Run Code Online (Sandbox Code Playgroud)
循环不再起作用。
/dev/udev/ 中的规则如下所示
SUBSYSTEM=="usb", ACTION=="add", RUN+="/bin/bash /usr/bin/myScript.sh"
Run Code Online (Sandbox Code Playgroud)
有人知道原因可能是什么吗?
这里有一些更多信息以及建议的基于您的答案的修改版本。
这里是 udev 规则:
# check usb sdb1 plugged unplugged
SUBSYSTEM=="block", ACTION=="add", RUN+="/bin/bash /usr/bin/usb_mount.sh"
SUBSYSTEM=="block", ACTION=="remove", RUN+="/bin/bash /usr/bin/usb_unmount.sh"
Run Code Online (Sandbox Code Playgroud)
安装脚本现在看起来如下:
#!/bin/bash
#general definitions
MNT_PATH="/media/USB_DRIVE"
DEV_ID="sdc1"
# check …
Run Code Online (Sandbox Code Playgroud) udev ×10
command-line ×4
systemd ×3
usb ×3
permissions ×2
scripts ×2
12.10 ×1
16.04 ×1
17.04 ×1
android ×1
automount ×1
bash ×1
networking ×1
touchscreen ×1
wayland ×1
windows-subsystem-for-linux ×1
xinput ×1