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

Linux -su:/dev/tty:没有这样的设备或地址,linux,docker,terminal,debian,tty,Linux,Docker,Terminal,Debian,Tty,有人能给我解释一下为什么会这样吗 # 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 我正在设计一个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
我正在设计一个docker容器,里面有两个服务。这些服务通过Shell脚本创建startet:

CMD ["./starter.sh"]
使用
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
问题是我试图以非root(
su)身份运行其中一个服务-
someone-c“service”
),它给出以下错误:

unable to open log file [/var/log/thelog.log]: [6] No such device or address
我怎样才能解决这个问题?我希望日志链接到
/dev/*
,并希望以非root用户身份运行该用户。我还尝试将用户添加到组
tty
,但没有成功


谢谢。

su的手册页声明执行的命令将没有控制终端。对/dev/tty的任何写入都将返回ENXIO错误:

$ errno ENXIO
ENXIO 6 No such device or address
sudo不分配控制终端:

sudo -u someone /bin/bash -c "echo hello > /dev/tty"

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

用符号链接替换设备似乎是一件非常脆弱和危险的事情。内核操纵tty,它不是一个静态文件描述符,这就是为什么首先会出现错误的原因。将服务包装成能够将其输出捕获到合理位置的东西。大多数sane服务都不会在控制台上打印任何内容。您好,谢谢,但这样做是docker的常见做法。重定向到
/dev/*
会使您看到带有
docker logs mycontainer
的日志。所以这件事的关键是
su-
,并以另一个(!=root)用户的身份启动该过程。您好,谢谢。是的,是的,我可以使用supervisor,我知道
用户
。但是,如何使用Shell脚本启动两个服务,其中一个必须作为非root用户运行,另一个必须作为root用户运行,而不使用supervisor?如果我使用
USER non_root
我无法启动root服务,因为我只有一个
RUN
命令。要么使用supervisor,要么在不同的容器中运行每个服务。只是想补充一下,即使使用
supervisord
也不可能将
/dev/tty
用作非root用户。