如何允许非默认用户使用串行设备ttyUSB0?


35

我有2个用户的Ubuntu 11.10系统:

  • 第一个是在安装过程中创建的
  • 相反,第二个之后创建。它属于sudoers组。

现在的问题是,当第二个尝试使用设备时,ttyUSB0将返回以下错误:

"Could not open serial port /dev/ttyUSB0"

我可以使用以下方法修复它:

sudo chown :second_user /dev/ttyUSB0

但是,当我断开设备并重新连接时,问题又回来了。

有没有办法允许不同的用户访问设备?我想我必须将用户添加到特定的组。目前的所有者是root,组为dialout。但是,我不确定该组,也不知道如何添加用户。

谢谢!

Answers:


48

您已经注意到,该/dev/ttyUSB0设备具有的组dialout。您需要做的就是将第二个用户添加到dialout组中:

sudo adduser second_user dialout

second_user将需要注销并重新登录才能生效。


谢谢杰里米!这对ssh访问也起作用吗?因为当我通过ssh访问PC时,我看到两个具有相同名称的用户。我想一个是本地用户,另一个是ssh。如何将所有权授予ssh用户?
Maverik 2012年

1
这将允许second_user从任何登录名,ssh或本地访问串行端口。您无需将所有权分配给该用户的特定登录名。
杰里米·克尔

2
是的,你是对的。我必须注销,然后再次登录才能访问ssh。
Maverik'3

对于自动登录的用户的会话,您需要重新启动计算机,而不仅仅是重新登录X Window System。在Ubuntu 19.04上观察到。
tanius

12

简单的方法:

sudoedit /etc/udev/rules.d/50-myusb.rules

保存此文本:

KERNEL=="ttyUSB[0-9]*",MODE="0666"
KERNEL=="ttyACM[0-9]*",MODE="0666"

拔下设备,然后重新插入,任何用户都应该对其进行读写操作!


适用于ttyACM插槽中的自制设备的14.04版本。谢谢。+1
NonStandardModel

在重新插入规则以重新加载规则之前,您不需要执行此操作吗?sudo udevadm control --reload
Alexis Paques

根据存储/ etc / udev的文件系统以及所拥有的udev版本,确实可能需要显式重新加载。但是在我使用过的大多数机器上,udev似乎可以自动解决(使用inotify)。
Orion Lawlor

那真的不是应该怎么做的。USB串行设备应属于拨出组或类似的组,并且应该将用户添加到其中。但是,您提出的建议对其他类型的USB设备还是有意义的
克里斯·斯特拉顿

7

您可以使用UDEV。这是一个每次插入或拔出设备(以及其他东西)时都会触发的系统。使用它,您可以编写各种脚本,包括设置权限。

运行sudoedit /etc/udev/rules.d/50-ttyusb.rules并将其粘贴在其中:

KERNEL=="ttyUSB[0-9]*",NAME="tts/USB%n",SYMLINK+="%k",GROUP="uucp",MODE="0666"

保存,退出并重新插电,您应该已启动并正在运行。将权限设置为666,任何人都可以写入设备。

我以几年前的本页为基础,但如果Jeremy的解决方案无效,则类似的事情应该起作用。


1
这对我有用,也就是说,我使用了udev规则,但是我更改了语法以匹配自己的情况。linux.m2osw.com/sane-cannot-find-any-scanners-请注意,如果使用MODE =“ 0666”,则可能不需要GROUP。只有其中一个有用。
亚历克西斯·威尔克2014年

5

太棒了-这里给出的UDEV解决方案对我来说是票。

我通过Wine安装了Icom的CS-F3020_F5010_F5020程序,创建了Com端口的链接,如下所示:

ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com1 but nothing. 

然后我意识到我需要更改/ dev / ttyUSB0的权限以允许我访问它。在您拔出/重新插入USB之前,这种方法非常有用,然后您需要重新更改权限。

我尝试将用户添加到拨出组,但是由于某种原因不能解决问题。

使用UDEV解决了难题的最后一部分。现在,我可以使用Linux对Icom无线电进行编程,无需再大惊小怪地插拔USB /串行设备。呜呼。谢谢。


3

udev规则有效,但按照书面规定,它们具有使所有人ttyUSB*都能使用所有设备的非常讨厌的副作用。这不是很好,因为这可能会带来安全风险,具体取决于系统上的其他内容。

而是使用更具选择性的udev规则。例如,我有一个操作一组开关的USB设备。从dmesg插入时,我可以看到制造商的ID和产品代码(在这种情况下,甚至还有设备的序列号)。我可以添加:

ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001"

到上面的内核行,该规则将仅适用于该设备。与其MODE单独分配变量,不如将组设置为更好:

GROUP="whatever", MODE="0660"

那么只有“ whatever” 组中的人才能获得写访问权限。

约翰·鲍勒

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.