升级到Python3.9后无法连接到EC2 ubuntu 18.04实例



我正在使用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

最新更新