Python實現在Linux系統下更改當前進程運行使用者

來源:互聯網
上載者:User
在上一篇文章中,我們講了如何在linux上用python寫一個守護進程。主要原理是利用linux的fork函數來建立一個進程,然後退出父進程運行,產生的子進程就會成為一個守護進程。細心觀察的可能會發現,這個守護進程的運行身份是執行這個程式的使用者,如果把這個精靈加入到系統的服務項,那麼這個精靈的執行身份應該是root。

一個情況出現了,root的許可權比較大,如果通過這個root身份的精靈來進行操作,危險性是比較大的。一種好的辦法是產生一個身份為root的master進程用來接受請求,產生若干個woker進程用來處理請求,這樣就不會出現許可權過大問題。事實上,現在很多軟體,nginx,mysql,apache,vsftpd等幾乎都是這樣做的。

那麼,怎麼樣在linux中更改子進程的運行身份呢?,實際上linux提供了這樣的函數,來看一下python代碼:

#!/usr/bin/env pythonimport time,os,pwd,sys,signallogfile="/tmp/d2.log"#step one, get the username you want to running withtry:    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_uidexcept:    print "Uer not exists!"    sys.exit(-1)#step two:Generation of daemonpid=os.fork()if(pid):sys.exit(0)os.setsid()os.chdir("/")os.umask(0)#step three :fork againpid=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為系統中已經添加的使用者),然後用ps aux|grep python查看系統當中啟動並執行python程式,可以看到,有一個woker進程的身份已經改變了成為nginx了:

[root@home ~]# ps aux|grep pythonroot   1139 0.0 0.5  5288 2372 ?    Ss  22:40  0:00 python ./d2.py nginxnginx   1140 0.0 0.5  5288 2360 ?    S  22:40  0:00 python ./d2.py nginxroot   1151 0.0 0.1  2336  648 pts/0  S+  22:50  0:00 grep python

因為身份為nginx的進程是用來處理請求的,那麼一些屬於root的許可權就不會被進程調用,也可以通過設定檔案的許可權,對進程操作單個檔案進行限制,達到比較好的許可權控制效果,減少安全隱患。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.