-su: /dev/tty: 没有这样的设备或地址

che*_*ier 2 linux terminal debian tty docker

有人可以向我解释一下为什么会发生这种情况吗?

# su - someone -s /bin/bash -c "ls -la /dev/tty"
crw-rw-rw- 1 nobody nogroup 5, 0 Dec  7 20:53 /dev/tty
# BUT:
# su - someone -s /bin/bash -c "echo hello > /dev/tty"
-su: /dev/tty: No such device or address
Run Code Online (Sandbox Code Playgroud)

我正在尝试构建一个 docker 容器,其中包含两个服务。这些服务由 Shell 脚本启动:

CMD ["./starter.sh"]
Run Code Online (Sandbox Code Playgroud)

使用Dockerfile我已将日志重定向到/dev/stderr/dev/tty

# None of the following works:
RUN ln -sf /dev/tty /var/log/thelog.log
RUN ln -sf /dev/stdout /var/log/thelog.log
RUN ln -sf /dev/stderr /var/log/thelog.log
Run Code Online (Sandbox Code Playgroud)

问题是我试图以非 root ( su - someone -c "service") 身份运行其中一项服务,这会出现以下错误:

unable to open log file [/var/log/thelog.log]: [6] No such device or address
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我希望将日志链接到/dev/*并希望以非 root 身份运行用户。我还尝试将用户添加到组中tty,但没有成功。

谢谢。

Ric*_*nco 5

su的联机帮助页指出所执行的命令将没有控制终端。对 /dev/tty 的任何写入都将返回 ENXIO 错误:

$ errno ENXIO
ENXIO 6 No such device or address
Run Code Online (Sandbox Code Playgroud)

sudo确实分配了一个控制终端:

sudo -u someone /bin/bash -c "echo hello > /dev/tty"
Run Code Online (Sandbox Code Playgroud)

如果您在 Dockerfile 或Supervisor中使用USER指令,则无需创建到 /dev/tty 的符号链接(/dev/stdout 和 /dev/stderr 就足够了)或使用sudo