当我在Docker容器上使用CentOs 8时,我发现who
和w
命令的输出总是空的。
[root@9e24376316f1 ~]# who
[root@9e24376316f1 ~]# w
01:01:50 up 7:38, 0 users, load average: 0.00, 0.04, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
即使我在第二个终端中以不同用户的身份登录。当我想要write
给这个用户时,它会显示
[root@9e24376316f1 ~]# write test
write: test is not logged in
是因为码头工人吗?也许它能以某种方式阻止会话之间的见面?或许这是另外一个问题。我真的很想得到一些解释。
发布于 2020-03-16 22:31:52
这些实用程序从阿奇普文件(/var/run/utmp
)获取有关当前登录的信息。您可以很容易地检查在普通情况下(例如在桌面系统上),该文件包含类似于以下字符串的内容(在这里,qazer
是我的登录名,tty7
是运行桌面环境的TTY ):
$ cat /var/run/utmp
tty7:0qazer:0�o^�
在容器中,此文件(通常)为空:
$ docker run -it centos
[root@5e91e9e1a28e /]# cat /var/run/utmp
[root@5e91e9e1a28e /]#
为什么?
utmp
文件通常由对用户进行身份验证并启动会话的程序进行修改:login(1)
、sshd(8)
、lightdm(1)
。但是,容器引擎不能依赖它们,因为它们可能在容器文件系统中不存在,因此“登录”和“代表用户执行”是以最原始和最直接的方式实现的,避免了对容器内部任何内容的依赖。
当任何容器启动或其中的任何命令都是exec
d时,容器引擎just将生成新进程,安排一些安全设置,调用setgid(2)
/setuid(2)
强制(无需任何身份验证)更改进程‘UID/GID,然后在此进程中执行所需的二进制文件(入口点、命令等)。
比方说,我代表UID CentOS启动了运行其主进程的42
容器。
docker run -it --user 42 centos
然后尝试在其中执行sleep 1000
:
docker exec -it $CONTAINER_ID sleep 1000
容器引擎将执行如下操作:
[pid 10170] setgid(0) = 0
[pid 10170] setuid(42) = 0
...
[pid 10170] execve("/usr/bin/sleep", ["sleep", "1000"], 0xc000159740 /* 4 vars */) = 0
不会对/var/run/utmp
进行写操作,因此它将保持为空,who(1)
/w(1)
将不会在容器中找到任何登录。
https://stackoverflow.com/questions/60699218
复制相似问题