[Python] 移除 Python 3 的 pycrpto 套件會讓 SSH 連線失敗?

[Python] 移除 Python 3 的 pycrpto 套件會讓 SSH 連線失敗?

最近在把專案的程式從 Python 2 搬移至 Python 3 上,

結果今天遇到一件怪事…

 

我是用 SSH 連線至遠端的 Ubuntu 機器上做事。

本來正在用  pip3 freeze 檢查目前 Python 3 裝了哪些套件,

發現 pycrypto 這個套件,我們的專案程式自己也有帶了。

 

嗯嗯~根據好童軍的守則「離開的時候要比來的時候更乾淨」,

決定好心的幫忙把系統 Python 3 裡的 pycrpto 套件移掉,

反正我們專案自己有帶:

sudo pip3 uninstall pycrypto

 

移除掉後,我還繼續在 SSH 連線裡,跑一下單元測試,

確定剛剛的移除動作沒有影響到專案,一切完美~

 

但奇怪的是,一陣子後,

我想要開另一個 SSH 連線到同一台 Ubuntu 機器,做另一件工作,

這時卻連不上了,只拿到一個簡短的 Connection closed 訊息:

$ ssh root@172.1.2.3

Connection closed by 172.1.2.3 port 22

 

有點奇怪,為什麼會連不上 SSH 呢?

但原本還連著的 SSH 連線,還可以持續操作…

後來因為 VPN 不穩斷線,這時就完全連不回 Ubuntu 機器了…

 

弄了半天,實在沒有辦法,只好把機器回復到之前的快照狀態,

接著就繼續把機器復原到掛掉之前的情況,

想說要繼續來做 Python 3 的搬移工作,

結果… 新的 SSH 連線又突然不能連了,這到底是?!

 

回想了一下掛掉前的操作,突然想到一個可能的點,

那就是我後來又移除了一次 pycrypto (因為快照裡是有 pycrypto 的)。

立馬再回復快照一次,再移除 pycrypto 看看…

果真,在移除之前,SSH 新連線都可以建立。

一移除後,SSH 新連線就無法成功了…

可見 sshd 模組應該是相依於 pycrypto 這個 Python 3 套件的

(不過為啥我移除 pycrypto 模組,也沒見到什麼恐怖的警告呀?)

 

假設問題已經發生了,且 SSH 連線還存在的話,那還有的救,

就把 pycrypto 裝回去就行了。

不過像下面這樣跑的話,有可能是不行的,:

sudo pip3 install pycrypto

 

為什麼呢?

因為移除掉的 pycrypto 套件,

原本是在像 /usr/lib64/python3.6/site-packages/Crypto 這種路徑,

但新裝的卻會是在 /usr/local/lib64/python3.6/site-packages/Crypto 路徑上,

可能 sshd 模組哪邊寫死了路徑,就找不到了 (← 純亂猜)

# pip3 show pycrypto

Name: pycrypto
Version: 2.6.1
Summary: Cryptographic modules for Python.
Home-page: http://www.pycrypto.org/
Author: Dwayne C. Litzenberger
Author-email: dlitz@dlitz.net
License: UNKNOWN
Location: /usr/lib64/python3.6/site-packages
Requires:

 

要讓 pycrypto 裝回原本的 /usr 路徑 (而不是 /usr/local),

得在 pip3 指令中加入  --prefix 參數,例如:

sudo pip3 install pycrypto --prefix /usr

 

這樣子裝好的 pycroto,就會是在 /usr/lib64/python3.6/site-packages/Crypto 路徑上,

而且新的 SSH 連線也可以立刻成功囉~

 

心得:真的不要亂刪系統裡的東西…

 

參考資料:python – Where does pip install its packages?

(本頁面已被瀏覽過 12 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料