Python實(shí)現(xiàn)在Linux系統(tǒng)下更改當(dāng)前進(jìn)程運(yùn)行用戶
在上一篇文章中,我們講了如何在linux上用python寫一個(gè)守護(hù)進(jìn)程。主要原理是利用linux的fork函數(shù)來創(chuàng)建一個(gè)進(jìn)程,然后退出父進(jìn)程運(yùn)行,生成的子進(jìn)程就會(huì)成為一個(gè)守護(hù)進(jìn)程。細(xì)心觀察的可能會(huì)發(fā)現(xiàn),這個(gè)守護(hù)進(jìn)程的運(yùn)行身份是執(zhí)行這個(gè)程序的用戶,如果把這個(gè)守護(hù)程序加入到系統(tǒng)的服務(wù)項(xiàng),那么這個(gè)守護(hù)程序的執(zhí)行身份應(yīng)該是root。
一個(gè)情況出現(xiàn)了,root的權(quán)限比較大,如果通過這個(gè)root身份的守護(hù)程序來進(jìn)行操作,危險(xiǎn)性是比較大的。一種好的辦法是生成一個(gè)身份為root的master進(jìn)程用來接受請(qǐng)求,生成若干個(gè)woker進(jìn)程用來處理請(qǐng)求,這樣就不會(huì)出現(xiàn)權(quán)限過大問題。事實(shí)上,現(xiàn)在很多軟件,nginx,mysql,apache,vsftpd等幾乎都是這樣做的。
那么,怎么樣在linux中更改子進(jìn)程的運(yùn)行身份呢?,實(shí)際上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)
運(yùn)行這個(gè)程序,輸入nginx(nginx為系統(tǒng)中已經(jīng)添加的用戶),然后用ps aux|grep python查看系統(tǒng)當(dāng)中運(yùn)行的python程序,可以看到,有一個(gè)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
因?yàn)樯矸轂閚ginx的進(jìn)程是用來處理請(qǐng)求的,那么一些屬于root的權(quán)限就不會(huì)被進(jìn)程調(diào)用,也可以通過設(shè)置文件的權(quán)限,對(duì)進(jìn)程操作單個(gè)文件進(jìn)行限制,達(dá)到比較好的權(quán)限控制效果,減少安全隱患。
相關(guān)文章
flask框架使用orm連接數(shù)據(jù)庫(kù)的方法示例
這篇文章主要介紹了flask框架使用orm連接數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了flask框架使用flask_sqlalchemy包進(jìn)行mysql數(shù)據(jù)庫(kù)連接操作的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07Python爬蟲beautifulsoup4常用的解析方法總結(jié)
今天小編就為大家分享一篇關(guān)于Python爬蟲beautifulsoup4常用的解析方法總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02地圖可視化神器kepler.gl python接口的使用方法
這篇文章主要介紹了python 地圖可視化神器kepler.gl近期重要更新的的相關(guān)資料,幫助大家利用python實(shí)現(xiàn)地圖可視化,感興趣的朋友可以了解下2020-12-12Windows8下安裝Python的BeautifulSoup
這篇文章主要介紹了Windows8下安裝Python的BeautifulSoup,本文著重講解安裝中出現(xiàn)的錯(cuò)誤和解決方法,需要的朋友可以參考下2015-01-01python3.6實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python3.6實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02