我正在使用EC2 Ubuntu 18.04 VM。
由于CVE-2021-3177,Python需要升级到Python3.9的最新版本,该版本目前为3.9.9。
我按照下面提到的步骤使用了死蛇选项:
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install python3.9
sudo apt-get update
sudo apt upgrade -y
以上内容确保Python3.9.9现在可用。但现在蟒蛇3.6&python3.9可用。因此,接下来我们将使用updatealternates命令将python3.9作为默认版本。
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2
既然已经定义了备选方案,我们将切换到选项2作为默认选项,即Python3.9
sudo update-alternatives --config python3
完成后,以下命令将指向最新版本。
sudo python3 -V
但是,如果您使用sudo apt update
命令,您将看到一个错误,指出
Traceback (most recent call last):
File "/usr/lib/cnf-update-db", line 8, in <module>
from CommandNotFound.db.creator import DbCreator
File "/usr/lib/python3/dist-packages/CommandNotFound/db/creator.py", line 11, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Reading package lists... Done
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi'
E: Sub-process returned an error code
要解决这个问题,我们必须使用以下命令添加一个链接
cd /usr/lib/python3/dist-packages/
sudo ln -s apt-pkg.cpython-{36m,39m}-x86_64-linux-gnu.so
下面也是可选的,我尝试了使用和不使用以下命令
apt purge python3-apt
apt install python3-apt
sudo apt install python3.9-distutils python3.9-dev
一旦完成以下命令将不会导致任何错误
sudo apt update
这意味着问题已经解决。
但由于某种原因,我以后无法连接到机器,或者如果我使用它创建AMI,我就无法使用PUTTY或SCP连接到启动的实例
Ubuntu-20.x也存在同样的问题
感谢你的帮助。
升级Python后,cloud init所依赖的以下Python模块出现问题,这反过来又阻止了EC2使用cloud init正确配置新启动的EC2实例,这就是它无法访问的原因:
- 安装工具
- urllib3
- 请求
- jinja2
- netifaces
您可以通过转到AWS Web控制台中的EC2实例并单击:来调试此问题
Actions -> Monitor and troubleshoot -> Get system log
有时更新需要一段时间,所以请单击刷新按钮,直到出现日志为止。下载日志会更容易阅读日志。这就是帮助我解决问题的原因。
以下步骤为我解决了Ubuntu 18.04 LTS上的问题:
对于Ubuntu 20.04 LTS,将符号链接中的36m
更改为38
# Add deadsnakes ppa repository
sudo add-apt-repository ppa:deadsnakes/ppa
# Install new python version
sudo apt update
sudo apt install python3.10
# Fix broken apt_inst after python upgrade
sudo ln -s /usr/lib/python3/dist-packages/apt_inst.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_inst.so
# Fix broken apt_pkg after python upgrade
sudo ln -s /usr/lib/python3/dist-packages/apt_pkg.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/apt_pkg.so
# Make installed python version an alternative with a priority of 2
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
# Make upgraded python version an alternative with a priority of 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
# Reinstall python3-apt
sudo apt remove --purge python3-apt
sudo apt autoclean
sudo apt install python3-apt
# Install required packages
sudo apt install
build-essential
python3.10-distutils
python3.10-venv
libpython3.10-dev
# Install latest pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python3.10 get-pip.py
# Upgrade outdated python libraries that break cloud-init
sudo -i
pip3 install --upgrade setuptools
pip3 install --upgrade urllib3
pip3 install --upgrade requests
pip3 install --upgrade jinja2
pip3 install --upgrade netifaces
pip3 install --upgrade --ignore-installed pyyaml
exit
# Upgrade cloud-init to latest version
sudo apt install --only-upgrade cloud-init
如果您使用Ansible,它也会受到升级的影响。
Ansible可以固定如下:
编辑/usr/lib/python3/dist-packages/apt/package.py
并更改以下行:
from collections import Mapping, Sequence
至:
from collections.abc import Mapping, Sequence
如果死蛇存储库能够提供python3-apt(例如python3.10-apt(的更新来解决这个问题,那将是非常有用的。
参考:https://cloudbytes.dev/snippets/upgrade-python-to-latest-version-on-ubuntu-linux