首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CentOS 8 Docker容器中的who和w命令

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

Stack Overflow用户
提问于 2020-03-16 01:05:19
回答 1查看 133关注 0票数 3

当我在Docker容器上使用CentOs 8时,我发现whow命令的输出总是空的。

代码语言:javascript
运行
复制
[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给这个用户时,它会显示

代码语言:javascript
运行
复制
[root@9e24376316f1 ~]# write test
write: test is not logged in

是因为码头工人吗?也许它能以某种方式阻止会话之间的见面?或许这是另外一个问题。我真的很想得到一些解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-16 22:31:52

这些实用程序从阿奇普文件(/var/run/utmp)获取有关当前登录的信息。您可以很容易地检查在普通情况下(例如在桌面系统上),该文件包含类似于以下字符串的内容(在这里,qazer是我的登录名,tty7是运行桌面环境的TTY ):

代码语言:javascript
运行
复制
$ cat /var/run/utmp
tty7:0qazer:0�o^�

在容器中,此文件(通常)为空:

代码语言:javascript
运行
复制
$ docker run -it centos
[root@5e91e9e1a28e /]# cat /var/run/utmp
[root@5e91e9e1a28e /]#

为什么?

utmp文件通常由对用户进行身份验证并启动会话的程序进行修改:login(1)sshd(8)lightdm(1)。但是,容器引擎不能依赖它们,因为它们可能在容器文件系统中不存在,因此“登录”和“代表用户执行”是以最原始和最直接的方式实现的,避免了对容器内部任何内容的依赖。

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

比方说,我代表UID CentOS启动了运行其主进程的42容器。

代码语言:javascript
运行
复制
docker run -it --user 42 centos

然后尝试在其中执行sleep 1000

代码语言:javascript
运行
复制
docker exec -it $CONTAINER_ID sleep 1000

容器引擎将执行如下操作:

代码语言:javascript
运行
复制
[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)将不会在容器中找到任何登录。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60699218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档