没有权限在Docker容器内更改tty模式

时间:2019-05-30 13:53:34

标签: linux docker tty ioctl

我正在尝试在Docker容器中运行某些软件,该容器想要为当前使用的tty做VT_SETMODE。这将始终失败,并显示一条错误消息“不允许操作”。

我尝试在没有运气的情况下玩权限/组。

最后,我创建了一个小片段来重现该错误:

#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>

int main() {
        const char *tty_path;
        tty_path = "/dev/tty1";

        int fd = open(tty_path, O_RDWR | O_CLOEXEC);

        if (fd < 0) {
                printf("ERROR: Failed to open %s\n", strerror(errno));
                return 1;
        }

        struct vt_mode mode = {
                .mode = VT_AUTO,
        };
        errno = 0;

        ioctl(fd, VT_SETMODE, &mode);

        if (errno) {
                printf("ERROR: %s\n", strerror(errno));
                return 1;
        }

        return 0;
}

我在带有简单dockerfile的docker容器中运行代码:

FROM archlinux/base

RUN pacman -Sy --noconfirm gcc

那是从命令开始的:

docker build -f Dockerfile -t tty-test . && docker run --device /dev/tty1 -v $HOME/tty-test:/volume -it tty-test /bin/bash -c 'cd /volume && gcc tty_r.c && ./a.out ; /bin/bash'

输出是这样的

ERROR: Operation not permitted

谁能解释为什么不能从容器访问tty,或者有某种方法可以对容器进行更多控制?

1 个答案:

答案 0 :(得分:0)

好的,看来我已经解决了自己的问题。我试图在没有特权进行tty配置的容器内运行代码。将--cap-add SYS_TTY_CONFIG添加到docker run命令可以解决此问题。