如何为 tty 指定 640 以外的模式并使其在重新启动后保持不变

如何为 tty 指定 640 以外的模式并使其在重新启动后保持不变

我的载板上有一个嵌入式设备(运行 Ubuntu 16.04 的 Nvidia Jetson TX2),需要使用串行端口。载板上的串口映射到ttyS0,默认为root所有,属于tty组:

crw--w----  1 root tty       4,  64 Aug  1 13:34 ttyS0

我已将用户添加ubuntu到组tty(这是我登录的组),但默认情况下该组没有 ttyS0 的读取权限。

sudo chmod g+r /dev/ttyS0修复了它,但是重新启动后该问题不会持续存在。我尝试创建各种 udev 规则(99-z_setup.rules):

KERNEL=="ttyS0", NAME="ttyS0", SYMLINK+="my_tty", GROUP:="tty", MODE:="0660", OWNER:="ubuntu"

或者

KERNEL=="ttyS0", NAME="ttyS0", SYMLINK+="my_tty", GROUP:="tty", MODE:="0660"

或者

KERNEL=="ttyS0", NAME="ttyS0", SYMLINK+="my_tty", GROUP="tty", MODE="0660"

这些结果是:

lrwxrwxrwx  1 root root           5 Aug  1 13:34 my_tty -> ttyS0
crw--w----  1 root tty       4,  64 Aug  1 13:34 ttyS0

所以我仍然无法访问它。我也尝试过

KERNEL=="ttyS0", ACTION=="add", PROGRAM="/usr/bin/sudo /home/ubuntu/bin/setup_tty.sh"

setup_tty.sh含有

#!/bin/bash

chmod g+r /dev/ttyS0
echo "setup_tty ran" >> /home/ubuntu/bin/tty.log

它回显到文件tty.log,所以我知道脚本运行,但权限仍然是

crw--w----  1 root tty       4,  64 Aug  1 13:44 ttyS0

这就像组/所有者/模式设置被忽略或被覆盖。我搜索过,有很多类似的问题,但它们的答案似乎总是将用户添加到组ttydialout.我的用户帐户已经是这两个帐户的成员,但没有骰子,因为默认情况下由于某种原因,该组没有读取权限。

我检查了 /etc/login.defs 并发现了这些行:

#       TTYPERM         Login tty will be set to this permission.
#
# If you have a "write" program which is "setgid" to a special group
# which owns the terminals, define TTYGROUP to the group number and
# TTYPERM to 0620.  Otherwise leave TTYGROUP commented out and assign
# TTYPERM to either 622 or 600.
#
# In Debian /usr/bin/bsd-write or similar programs are setgid tty
# However, the default and recommended value for TTYPERM is still 0600
# to not allow anyone to write to anyone else console or terminal

# Users can still allow other people to write them by issuing
# the "mesg y" command.

TTYGROUP        tty
TTYPERM         0600

我将 TTYPERM 值更改为 0660 并重新启动,但没有任何区别。

有什么想法可以让这个 tty 在重新启动后具有 640 以外的模式吗?

这可能就是答案 - 我运行journalctl | grep tty并发现了以下输出:

Aug 02 11:05:45 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:47 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Started Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: [email protected]: Service hold-off time over, scheduling restart.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Stopped Serial Getty on ttyS0.
Aug 02 11:05:48 TX2-JUDY systemd[1]: [email protected]: Start request repeated too quickly.
Aug 02 11:05:48 TX2-JUDY systemd[1]: Failed to start Serial Getty on ttyS0.

所以看起来其他一些服务(不确定 Getty 是什么)正在尝试使用 ttyS0。

答案1

如果您使用的是登录,请查看/etc/login.defs、 条目TTYPERM

一般调试建议:在脚本开始时,您应该使用它来捕获命令的错误输出,并验证设备条目是否已存在。

exec >> /home/ubuntu/bin/tty.log 2>&1

答案2

所以事实证明,就我而言,ttyS0 是 TX2 的串行控制台,因此尝试按照我想要的方式使用它会更加痛苦,而不是值得的。看来 ttyTHS2 也可用并且已经具有所需的权限。这不是一个特别令人满意的答案,但却是前进的最佳方法。

相关内容