WSL 2 中的 Kali 无法以 esm 模式启动 kex

WSL 2 中的 Kali 无法以 esm 模式启动 kex

我在 Kali Linux 上使用 ESM 模式的 kali-win-kex 时遇到了问题。我按照 win kex 的说明一步步操作,如下图所示kali.org(请注意,我之前已多次执行过此过程,没有任何问题)尝试运行时kex --esm -s出现以下错误:

┌──(jralphw㉿jralphw)-[~]
└─$ kex --esm -s
/usr/bin/kex: line 291: cmdkey.exe: command not found
Please enter ESM password for user jralphw:
/usr/bin/kex: line 371: mstsc.exe: command not found

cmdkey.exe 和 mstsc.exe 都是我的计算机上有效的 Windows 程序...通过Win+R运行对话框执行时,cmdkey 会产生终端输出,mstsc 会打开 RDP 客户端。此外,只需使用kaliwsl命令启动 Kali 就会出现以下错误消息:

 -bash: .: filename argument required
.: usage: . filename [arguments]
┌──(jralphw㉿jralphw)-[~]
└─$

注意:我之前在这台机器上使用过 kali-win-kex,没有任何问题。然而,出现了一种情况,我不得不重新安装 Windows 并重新设置一切。

答案1

遇到了同样的问题。禁用 systemd/etc/wsl.conf为我解决了这个问题(当wsl.conf更改时,wsl --shutdown需要重新启动(即)。

答案2

同样的问题,以下是我最终解决的方法:

首先运行以下命令并设置密码:

sudo kex -esm 

从那时起它就开始工作了。不知道为什么错误没有提到密码。

因为我已经为“kex --win -s”设置了密码,并且该密码也与 kex --sl -s 一起使用,所以我从来没有想到 esm 需要再次设置密码。

这可能是必需的,因为 --esm 会调出一个 VNC 客户端来连接到 Kali,而 --win 和 --sl 模式会分别调出 RDP 客户端和 X-Server(客户端)。

在此之前我没有做任何其他更改 - 仅阅读了,关于日志文件权限和 exe 等 - 所以我希望这对其他人也有效。

仅供参考,这是第三次安装 kali win kex(在不同机器上),其中某些 kex 模式出现错误,而其他 2 个模式则正常工作。之前是防火墙错误(编辑防火墙规则后修复)和 Windows X-server 配置问题(通过安装不同的 x-server 应用程序解决,因为我不知道哪里出了问题)

答案3

这似乎是 Kali 中针对 WSL 的一个错误。它并不特定于 Kex。它最近开始出现,因为显然 Kali WSL 安装程序终于(在被已经过时好几年了) 已在 CDN 上更新。

正如所指出的这个 Github 问题,问题是由于损坏的/etc/profile。该文件存在多个问题,并且似乎可能是由于 Kali 构建系统中的引用/转义问题导致的。文件中完全缺失了可分离变量名和其他字符串插值。

除了启动 Kali 时出现的错误之外,您还会发现由于这些问题,Windows 路径不再附加到 WSL/Kali 路径。

据我所知,/etc/profile以前的 Kali 版本运行良好。使用sudo -e /etc/profile,将整个文件替换为:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

IS_WSL=`grep -i microsoft /proc/version` # WSL already sets PATH, shouldn't be overridden
if test "$IS_WSL" = ""; then
  if [ "`id -u`" -eq 0 ]; then
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  else
    PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
  fi
fi
export PATH

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

答案4

考虑以下输出:

-bash: .: 需要文件名参数 .: 用法:. 文件名 [参数]

查看 /etc/profile 底部的最后一个 for 循环,其中它以点的形式获取 /etc/profile.d/ 下的 *.sh 脚本,似乎它缺少文件名作为参数(在 $i 中)。

从此改变它..

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r ]; then
      .
    fi
  done
  unset i
fi

.. 对此:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
      . "$i"
    fi
  done
  unset i
fi

相关内容