[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 [email protected] 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: [email protected] 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?