在 WSL2 上启用 ufw 在 Ubuntu 上失败

在 WSL2 上启用 ufw 在 Ubuntu 上失败

这是全新安装的 Ubuntu 20.4 或 Ubuntu 22.04,但是当我尝试从 Ubuntu 控制台启用 ufw 时,它们都失败了,并出现如下错误。

 sudo ufw enable
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/ufw/util.py", line 427, in under_ssh
    ppid = get_ppid(pid)
  File "/usr/lib/python3/dist-packages/ufw/util.py", line 419, in get_ppid
    ppid = open(name).readlines()[0].split(')')[1].split()[1]
IndexError: list index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/sbin/ufw", line 138, in <module>
    not ui.continue_under_ssh():
  File "/usr/lib/python3/dist-packages/ufw/frontend.py", line 901, in continue_under_ssh
    if self.backend.do_checks and ufw.util.under_ssh(): # pragma: no cover
  File "/usr/lib/python3/dist-packages/ufw/util.py", line 457, in under_ssh
    return under_ssh(ppid)
  File "/usr/lib/python3/dist-packages/ufw/util.py", line 457, in under_ssh
    return under_ssh(ppid)

我的 WSL2 具有以下功能...

 wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2
  Ubuntu-20.04    Stopped         2

我在另一台电脑上有类似的配置,但没有这个问题。我关机、更新 WSL、重新安装了不同版本的 Ubuntu,但结果是一样的。我搜索了好几遍,但找不到任何匹配项。希望有 ufw 经验的专家能帮我。谢谢,

答案1

正如@NotTheDr01ds所说,这是一个错误。我提交了一份错误报告这里

更新:该问题已在 0.36.2 版中修复。不过,0.36.2 版可能还不适用于你的 Ubuntu 版本。你可以运行以下命令检查有哪些版本可用sudo apt update;apt policy ufw


您可以通过转到 util.py 中的 get_ppid 函数并将第一个拆分替换rsplit(')', 1)为根据最后一个括号而不是所有括号进行拆分来解决此问题。

前: ppid = open(name).readlines()[0].split(')')[1].split()[1]

后: ppid = open(name).readlines()[0].rsplit(')',1)[1].split()[1]

答案2

您肯定遇到了一个我可以重现的错误。我还不确定这个错误是在 Ubuntu 22.04 还是最近的 WSL 版本中引入的(当我缩小范围时我会更新,但从您的问题来看,您说的它也发生在 20.04 中)。这是一个很微妙的错误——我实际上必须打破 Python 调试器(pdb)来逐步执行 UFW 代码才能找出发生这种情况的原因。

归根结底,这是 UFW 代码中的解析问题,该代码遍历进程树以查看是否有任何父进程是 SSH 守护进程(sshd)。在 WSL 中,其中一个init进程在其 中返回“奇数”结果/proc/<pid>/stat。它不是在那里命名的init,而是类似于Relay(<PPID>)(其中 PPID 是父 Init 进程 PID)。UFW 代码的解析函数:

ppid = open(name).readlines()[0].split(')')[1].split()[1]

... 未预期带有括号的进程名称里面它。它期望 proc 名称被括号括起来。当它尝试拆分这个特定的 时/proc/<pid>/stat,额外的括号导致它返回一个空字符串而不是预期的父 PID,因此失败。

最终,这将需要上游修复。我确信有解决方法,但ufw我不建议修补系统。不过,我会在了解更多信息后更新此答案。

相关内容