Python 快速教程(標準庫09):當前程式資訊 (os包)

發表於2015-11-12

我們在Linux的概念與體系,多次提及程式的重要性。Python的os包中有查詢和修改程式資訊的函式。學習Python的這些工具也有助於理解Linux體系。

 

程式資訊

os包中相關函式如下:

uname() 返回作業系統相關資訊。類似於Linux上的uname命令。

umask() 設定該程式建立檔案時的許可權mask。類似於Linux上的umask命令,見Linux檔案管理背景知識

 

get*() 查詢 (*由以下代替)

uid, euid, resuid, gid, egid, resgid :許可權相關,其中resuid主要用來返回saved UID。相關介紹見Linux使用者與“最小許可權”原則

  pid, pgid, ppid, sid                 :程式相關。相關介紹見Linux程式關係

 

put*() 設定 (*由以下代替)

euid, egid: 用於更改euid,egid。

  uid, gid  : 改變程式的uid, gid。只有super user才有權改變程式uid和gid (意味著要以$sudo python的方式執行Python)。

pgid, sid : 改變程式所在的程式組(process group)和會話(session)。

 

getenviron():獲得程式的環境變數

setenviron():更改程式的環境變數

 

例1,程式的real UID和real GID

將上面的程式儲存為py_id.py檔案,分別用$python py_id.py和$sudo python py_id.py看一下執行結果

 

saved UID和saved GID

我們希望saved UID和saved GID如我們在Linux使用者與“最小許可權”原則中描述的那樣工作,但這很難。原因在於,當我們寫一個Python指令碼後,我們實際執行的是python這個直譯器,而不是Python指令碼檔案。對比C,C語言直接執行由C語言編譯成的執行檔案。我們必須更改python直譯器本身的許可權來運用saved UID機制,然而這麼做又是異常危險的。

比如說,我們的python執行檔案為/usr/bin/python (你可以通過$which python獲知)

我們先看一下

$ls -l /usr/bin/python

的結果:

-rwxr-xr-x root root

 

我們修改許可權以設定set UID和set GID位 (參考Linux使用者與“最小許可權”原則)

$sudo chmod 6755 /usr/bin/python

/usr/bin/python的許可權成為:

-rwsr-sr-x root root

 

隨後,我們執行檔案下面test.py檔案,這個檔案可以是由普通使用者vamei所有:

我們得到結果:

(1000, 0, 0)

上面分別是UID,EUID,saved UID。我們只用執行一個由普通使用者擁有的python指令碼,就可以得到super user的許可權!所以,這樣做是極度危險的,我們相當於交出了系統的保護系統。想像一下Python強大的功能,別人現在可以用這些強大的功能作為攻擊你的武器了!使用下面命令來恢復到從前:

$sudo chmod 0755 /usr/bin/python

 

關於指令碼檔案的saved UID/GID,更加詳細的討論見

http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html

 

總結

get*, set*

umask(), uname()

相關文章