Python實現(xiàn)在Linux系統(tǒng)下更改當(dāng)前進(jìn)程運行用戶
在上一篇文章中,我們講了如何在linux上用python寫一個守護(hù)進(jìn)程。主要原理是利用linux的fork函數(shù)來創(chuàng)建一個進(jìn)程,然后退出父進(jìn)程運行,生成的子進(jìn)程就會成為一個守護(hù)進(jìn)程。細(xì)心觀察的可能會發(fā)現(xiàn),這個守護(hù)進(jìn)程的運行身份是執(zhí)行這個程序的用戶,如果把這個守護(hù)程序加入到系統(tǒng)的服務(wù)項,那么這個守護(hù)程序的執(zhí)行身份應(yīng)該是root。
一個情況出現(xiàn)了,root的權(quán)限比較大,如果通過這個root身份的守護(hù)程序來進(jìn)行操作,危險性是比較大的。一種好的辦法是生成一個身份為root的master進(jìn)程用來接受請求,生成若干個woker進(jìn)程用來處理請求,這樣就不會出現(xiàn)權(quán)限過大問題。事實上,現(xiàn)在很多軟件,nginx,mysql,apache,vsftpd等幾乎都是這樣做的。
那么,怎么樣在linux中更改子進(jìn)程的運行身份呢?,實際上linux提供了這樣的函數(shù),來看一下python代碼:
#!/usr/bin/env python
import time,os,pwd,sys,signal
logfile="/tmp/d2.log"
#step one, get the username you want to running with
try:
user=sys.argv[1]
except:
user=raw_input('Please input a username in this machine you want to run this program: ')
if user=="":sys.exit(-1)
try:
uid=pwd.getpwnam(user)
uid=uid.pw_uid
except:
print "Uer not exists!"
sys.exit(-1)
#step two:Generation of daemon
pid=os.fork()
if(pid):sys.exit(0)
os.setsid()
os.chdir("/")
os.umask(0)
#step three :fork again
pid=os.fork()
if(pid==0):
os.setuid(uid)
os.setsid()
os.chdir("/")
os.umask(0)
log=open(logfile,'a')
log.write('Daemon start up at %s\n'%(time.strftime('%Y:%m:%d',time.localtime(time.time()))))
log.close()
def reload(a,b):
log=open(logfile,'a')
log.write('Daemon reload at %s\n'%(time.strftime('%Y:%m:%d',time.localtime(time.time()))))
log.close()
while True:
signal.signal(signal.SIGHUP,reload)
time.sleep(2)
運行這個程序,輸入nginx(nginx為系統(tǒng)中已經(jīng)添加的用戶),然后用ps aux|grep python查看系統(tǒng)當(dāng)中運行的python程序,可以看到,有一個woker進(jìn)程的身份已經(jīng)改變了成為nginx了:
[root@home ~]# ps aux|grep python root 1139 0.0 0.5 5288 2372 ? Ss 22:40 0:00 python ./d2.py nginx nginx 1140 0.0 0.5 5288 2360 ? S 22:40 0:00 python ./d2.py nginx root 1151 0.0 0.1 2336 648 pts/0 S+ 22:50 0:00 grep python
因為身份為nginx的進(jìn)程是用來處理請求的,那么一些屬于root的權(quán)限就不會被進(jìn)程調(diào)用,也可以通過設(shè)置文件的權(quán)限,對進(jìn)程操作單個文件進(jìn)行限制,達(dá)到比較好的權(quán)限控制效果,減少安全隱患。
相關(guān)文章
Flask與FastAPI對比選擇最佳Python?Web框架的超詳細(xì)指南
Flask和FastAPI都是流行的Python?Web框架,各有特點,Flask輕量級、靈活,適合小型項目和原型開發(fā)但不支持異步操作,FastAPI高性能、支持異步,內(nèi)置數(shù)據(jù)驗證和自動生成API文檔,適合高并發(fā)和API開發(fā),需要的朋友可以參考下2025-02-02
Numpy中矩陣matrix讀取一列的方法及數(shù)組和矩陣的相互轉(zhuǎn)換實例
今天小編就為大家分享一篇Numpy中矩陣matrix讀取一列的方法及數(shù)組和矩陣的相互轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
python基礎(chǔ)教程之python消息摘要算法使用示例
這篇文章主要介紹了python中的消息摘要算法使用示例,需要的朋友可以參考下2014-02-02
Python光學(xué)仿真數(shù)值分析求解波動方程繪制波包變化圖
這篇文章主要為大家介紹了Python光學(xué)仿真通過數(shù)值分析求解波動方程并繪制波包變化圖的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Python實現(xiàn)二叉樹結(jié)構(gòu)與進(jìn)行二叉樹遍歷的方法詳解
二叉樹是最基本的數(shù)據(jù)結(jié)構(gòu),這里我們在Python中使用類的形式來實現(xiàn)二叉樹并且用內(nèi)置的方法來遍歷二叉樹,下面就讓我們一起來看一下Python實現(xiàn)二叉樹結(jié)構(gòu)與進(jìn)行二叉樹遍歷的方法詳解2016-05-05
基于python制作簡易版學(xué)生信息管理系統(tǒng)
這篇文章主要介紹了基于python制作簡易版學(xué)生信息管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-04-04
用Python編寫簡單的gRPC服務(wù)的詳細(xì)過程
gRPC 是可以在任何環(huán)境中運行的現(xiàn)代開源高性能 RPC 框架。接下來通過本文給大家介紹用Python編寫簡單的gRPC服務(wù)的詳細(xì)過程,感興趣的朋友一起看看吧2021-07-07
Pytorch平均池化nn.AvgPool2d()使用方法實例
平均池化層,又叫平均匯聚層,下面這篇文章主要給大家介紹了關(guān)于Pytorch平均池化nn.AvgPool2d()使用方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
將pymysql獲取到的數(shù)據(jù)類型是tuple轉(zhuǎn)化為pandas方式
這篇文章主要介紹了將pymysql獲取到的數(shù)據(jù)類型是tuple轉(zhuǎn)化為pandas方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05

