記Python 「使用者環境」的一次完美應用

2022-06-05 14:42:06 字數 4393 閱讀 9198

我的 github:

在之前寫過一篇關於虛擬環境使用的文章 :python 虛擬環境使用指南.

但是還沒有好好的介紹一下 python 的使用者環境,原因是自己一直沒遇到要使用使用者環境的使用場景,所以就一直懶得寫。

恰巧這兩天,自己遇到了乙個使用使用者環境的體驗可以完爆虛擬環境的案例,就拿出來分享一下。

公司有數以萬計的伺服器,為了對實現對訪問記錄進行集中管理以及出於安全考慮,每台伺服器都有訪問限制,必須使用公司的跳板機才能登陸。

每個公司的員工在跳板機上都有自己的使用者、 家目錄,對於很多需要 root 許可權的操作,是高度受限制的。

比如我現在我要在跳板機上實現遠端登陸大批量的機器進行一些維護工作,當然我這裡使用的還是 python 來實現,這個 python 指令碼裡有一些依賴庫(比如 之前介紹過的 paramiko 這個神器),在跳板機上中並沒有安裝。

做為普通使用者的你,是沒有許可權安裝第三方包的。

問題就來了,我如何才能在跳板機中使用 paramiko 這個包呢?

既然不能對全域性的 python 環境進行更改,那我完全可以自己再建立乙個環境,只要這個環境裡事先裝好 paramiko 這個包不就好了。

因此,使用虛擬環境是一種解決方案,但它並不是乙個完美的解決方案。

原因有以下幾點

1、 建立虛擬環境的過程,步驟較多,比較複雜。這裡的複雜是相對於我後面要使用的使用者環境而言。

2、 虛擬環境是包含一整個 python 直譯器,存在大量與系統重複的包,size比較大,並不輕便。

3、 使用 console 模式除錯的話,進入很不方便

就算你不使用 console 模式,你呼叫指令碼的方式,也會很奇怪,你得這樣

$ zabbix_env/bin/python demo.py
如果你不想使用這樣,可以給這個指令碼加個可執行許可權,並在指令碼的第一行指定你的直譯器,省去了一點點麻煩,可即便如此,我仍然感覺很彆扭。

[wangbm@35ha02 ~]$ cat demo.py 

#!/home/wangbm/zabbix_env/bin/python

import zabbix_api

[wangbm@35ha02 ~]$

[wangbm@35ha02 ~]$

[wangbm@35ha02 ~]$ chmod +x demo.py

[wangbm@35ha02 ~]$

[wangbm@35ha02 ~]$ ./demo.py # 可以執行,沒有報錯

[wangbm@35ha02 ~]$

原因是跳板機裡的都是很古老的包,你看上面的 python 還是 2.7.5 呢,所以你所說的那些工具通通沒有。

這裡要介紹的這種方案(使用者環境),可能很多人都沒有使用過,甚至沒有聽過,它算是乙個冷門但是非常好用的功能。

操作之前 ,先簡單介紹一下它。

先提乙個問題,python 在查詢匯入包時,如果我們多個路徑都有這個包,那 python 如何確定應該從哪個路徑進行匯入呢?

答案是, 搜尋匯入路徑是有優先順序的,你可以通過 sys.path 進行檢視。

>>> import sys

>>> from pprint import pprint

>>> pprint(sys.path)

['',

'/usr/lib64/python27.zip',

'/usr/lib64/python2.7',

'/usr/lib64/python2.7/plat-linux2',

'/usr/lib64/python2.7/lib-tk',

'/usr/lib64/python2.7/lib-old',

'/usr/lib64/python2.7/lib-dynload',

'/home/wangbm/.local/lib/python2.7/site-packages',

'/usr/lib64/python2.7/site-packages',

'/usr/lib64/python2.7/site-packages/gtk-2.0',

'/usr/lib/python2.7/site-packages',

'/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg',

'/usr/lib/python2.7/site-packages/lockfile-0.12.2-py2.7.egg']

>>>

可以看到路徑/home/wangbm/.local/lib/python2.7/site-packages是優先於/usr/lib64/python2.7/site-packages路徑的。

這就是使用者環境的原理,只要我們將包裝在自己家目錄下,就可以優先於全域性環境中進行查詢。

使用起來,可以做到使用者無感知,跟使用原生的全域性環境並沒有區別。

建立乙個使用者環境,並安裝上你所需要的包,一條命令就能搞定,這可比虛擬環境簡單方便多了。

那麼怎麼操作呢?

只要你在使用 pip 安裝包時,加上--user引數,pip 就會將其安裝在當前使用者的~/.local/lib/python2.x/site-packages下,而其他使用者的 python 則不會受影響。

$ pip install --user pkg
這裡要注意的是,不能使用這種方式,親測它會將包裝到全域性環境下,具體原因我還沒有深究。

$ python -m pip install --user pkg
為了讓你理解這個過程,我這裡來舉個例子,並且驗證其是否可以做到使用者隔離。

# 在全域性環境中未安裝 requests

[root@localhost ~]$ pip list | grep requests

[root@localhost ~]$ su - wangbm

# 由於使用者環境繼承自全域性環境,這裡也未安裝

[wangbm@localhost ~]$ pip list | grep requests

[wangbm@localhost ~]$ pip install --user requests

[wangbm@localhost ~]$ pip list | grep requests

requests (2.22.0)

[wangbm@localhost ~]$

# 從 location 屬性可發現 requests 只安裝在當前使用者環境中

# 退出 wangbm 使用者,在 root 使用者環境中發現 requests 未安裝

[root@localhost ~]$ pip list | grep requests

[root@localhost ~]$

有了這個思路,我就可以先在其他機器(前提自己必須擁有管理員許可權 )上,建立乙個使用者環境,並且安裝上 paramiko 這個包。

然後將這個使用者環境,壓縮拷貝至跳板機自己的家目錄下的.local/lib目錄下並解壓。

然後直接使用 python 進入 console 模式,現在已經可以直接使用 paramiko 這個包了。

記一次Docker生產環境搭建

伺服器使用的是阿里雲ecs標準型,普通的centos7和docker環境映象。docker映象源在docker.io在國外速度很慢,所以配置下加速,daocloud加速位址 選擇linux加速配置命令,複製貼上執行,直接執行可能有個逗號錯誤,我是碰到了。解決方法是修改daemon.json檔案 cd...

記一次Oracle測試環境安裝

主機環境是由vmware esxi提供的。源主機環境如下 目標主機環境如下 安裝環境不能上網。臨時從網上下的putty。好在這個包比較小,只有2.83m。使用到了這個包中的psftp。putty反而沒用上,因為可以使用vmware登入linux圖形介面。對於linux 7較簡單,選擇server w...

記一次Python爬蟲入門

程式思路 程式步驟 2 分析該網頁的 3 findall查詢出所有的url,儲存到list中 4 遍歷list,儲存到本地 程式原始碼 請求網頁 import time import requests import re import os 請求頭部 headers response request...