每次重新启动时,所连接扫描仪的 USB 端口分配都不正确。我的目标是创建一个在重新启动时运行的脚本,消除我的交互。
以下是我手动纠正端口分配的方法。
1) lsusb -d 04f9:0272 #the output identifies the correct ports of the scanner
2) sudo chmod a+w /dev/bus/usb/001/002 #scanner now works
以下脚本创建变量,但 chmod 失败报告“没有这样的文件或目录”。
buss=$(lsusb -d 04f9:0272 |awk '{print $2}')
devis=$(lsusb -d 04f9:0272 |awk '{print $4}')
sudo chmod a+w /dev/bus/usb/$buss/$devis
当我回显 $buss 或 $devis 时,会显示正确的值。我知道我需要做更多的事情来自动化这个过程。
答案1
问题可能是lsusb
输出的特定格式:
% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ print "/dev/bus/usb/" $2 "/" $4 }'
/dev/bus/usb/001/001:
注意末尾额外的冒号。幸运的是,您可以轻松地在 awk 或 shell 中删除它,这是一个 awk 示例:
% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ a = $4; sub(/:$/, "", a); print "/dev/bus/usb/" $2 "/" a }'
/dev/bus/usb/001/001
答案2
看起来应该可以工作,只是 的输出lsusb
在设备号后面包含一个冒号:
$ lsusb -d 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
因此devis
变量将包含该内容,最终结果将是您尝试使用/dev/bus/usb/001/001:
冒号访问 , 。
您可以使用后缀删除扩展来删除尾随冒号,如下所示:
devis=${devis%:}
仅在 shell(不带awk
)中执行此操作的另一种方法是仅read
输出lsusb
.这只需要第一行lsusb
输出,如果有多个设备匹配,可能会有更多。
在具有进程替换的 shell 中:
read x buss x devis x < <(lsusb -d 04f9:0272)
devis=${devis%:}
chmod +w "/dev/bus/usb/$buss/$devis"
或者用管道:
lsusb -d 04f9:0272 | {
read x buss x devis x
devis=${devis%:}
chmod +w "/dev/bus/usb/$buss/$devis"
}
答案3
ls -l
在评论中,您提供设备的输出:
crw-rw-r-- 1 root lp 189, 1 Jul 24 18:48 /dev/bus/usb/001/002
您可以看到该用户和组已经具有读/写访问权限。因此,如果您将用户添加到组中,lp
则不需要任何脚本内容。