gpt4 book ai didi

docker - CentOS 8 Docker 容器中的 who 和 w 命令

转载 作者:行者123 更新时间:2023-12-02 07:29:39 24 4
gpt4 key购买 nike

在 Docker 容器上使用 CentOs 8 时,我发现 whow 命令的输出始终为空。

[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

即使我在第二个终端中以不同用户身份登录。当我想写入给该用户时,它会显示

[root@9e24376316f1 ~]# write test
write: test is not logged in

这是因为 Docker 吗?也许它以某种方式工作,不允许 session 互相看到?或者也许这是其他问题。我真的很感激一些解释。

最佳答案

这些实用程序从 utmp 获取有关当前登录的信息。文件(/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 文件通常由验证用户身份并启动 session 的程序修改:login(1)sshd(8)lightdm(1)。然而,容器引擎无法依赖它们,因为它们可能不存在于容器文件系统中,因此“登录”和“代表执行”以最原始、最直接的方式实现,避免依赖任何东西在容器内。

当启动任何容器或在其中执行任何命令时,容器引擎只是生成新进程,安排一些安全设置,调用setgid (2)/setuid(2) 强制(无需任何身份验证)更改进程的 UID/GID,然后执行所需的二进制文件(入口点、命令等) )在此过程中。

假设,我启动代表 UID 42 运行其主进程的 CentOS 容器:

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) 将在容器内找不到任何登录信息。

关于docker - CentOS 8 Docker 容器中的 who 和 w 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60699218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com