who 命令在 WSL2 上没有输出

who 命令在 WSL2 上没有输出

我在 Windows 10 上的 Linux 的 Windows 子系统中使用 Ubuntu 20.04。当我键入命令时,who没有得到任何输出:

renniej@ratitch:~$ whoami
renniej
renniej@ratitch:~$ who
renniej@ratitch:~$

我尝试过各种各样的方法sudo whowho -a但仍然没有得到任何输出。who --version给出:

who (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Joseph Arceneaux, David MacKenzie, and Michael Stone.

我在这里做了什么傻事吗?或者这是 WSL2 的一个功能?

答案1

简短回答

没什么可笑的。与根本原因相关的 Github 问题。虽然 WSL 团队最初将其标记为“按设计”和“功能”,但去年对其的活动表明它“高价值低成本”。

再说一次,最近有人指出它是 5 年前创建的,并且没有其他用户希望修复它。我猜除非 WSL 采用更类似 Systemd 的启动方法(详情见下文),否则这种情况不会改变。

解释

... 或您可能想知道的更多信息who

who没有显示任何结果的原因有两个:

  • 首先,显而易见的是 --who旨在显示(引用手册页)“谁登录了”。当您启动 WSL 时,它实际上不会向用户发送登录密码,这就是您不需要输入密码的原因。

  • 其次,WSL 在启动时以 PID1 的形式运行自己的/init进程,它可以完成如下设置的“神奇”功能:

    • Linux 网络能够搭载在 Windows 网络上
    • Windows 驱动器的自动安装
    • .exe允许Windows 运行的互操作
    • 和更多 ...

    另一方面,“普通”Linux 系统使用 Systemd 或 SysVInit(或多年来少量其他 init 系统)启动。init 系统负责建立运行级别等。除此之外(我自己也是从 Github 问题中了解到这一点),/var/run/utmp构造,它可以追踪谁在使用系统。

有几种方法可以“强迫”谁工作:

  • 第一个在 Github 线程中介绍过。首先,/var/run/utmp使用类似下面的代码进行破解:

    sudo bash -c "echo '[1] [00049] [~~  ] [runlevel] [~           ] [4.4.0-17115-Micoroso] [0.0.0.0        ] [Wed Feb 28 13:27:14 2018 STD]' | utmpdump -r > /var/run/utmp"
    

    然后,使用 强制“登录” sudo login -f $USER。然后,您可以看到您的用户使用 登录who。如果您再次通过 登录ssh(您需要先进行设置),那么该登录名也会出现。

  • 现在,您可以使用 WSL 版本 0.67.6 或更高版本在 WSL 下运行 Systemd,详情请参阅这个答案,但您仍然需要强制login(如上所述)最有可能..

  • 最后,您可以在其自己的 PID 命名空间中手动启动 Systemd:

    sudo -b unshare --pid --fork --mount-proc /lib/systemd/systemd --system-unit=basic.target
    

    等待几秒钟,Systemd 启动并初始化/var/run/utmp。从技术上讲,此时您可以sudo login -f $USER看到who

    请注意,如果没有额外的努力(超出了这个答案的范围),并且你必须完成此操作后,终止 Ubuntu WSL 实例以返回稳定状态。退出 WSL,然后wsl --terminate <distro><distro>可能ubuntu)。重新启动后,一切都将恢复正常。

相关内容