这是全新安装的 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
我不建议修补系统。不过,我会在了解更多信息后更新此答案。