Python实现在Linux系统下更改当前进程运行用户


Posted in Python onFebruary 04, 2015

在上一篇文章中,我们讲了如何在linux上用python写一个守护进程。主要原理是利用linux的fork函数来创建一个进程,然后退出父进程运行,生成的子进程就会成为一个守护进程。细心观察的可能会发现,这个守护进程的运行身份是执行这个程序的用户,如果把这个守护程序加入到系统的服务项,那么这个守护程序的执行身份应该是root。

一个情况出现了,root的权限比较大,如果通过这个root身份的守护程序来进行操作,危险性是比较大的。一种好的办法是生成一个身份为root的master进程用来接受请求,生成若干个woker进程用来处理请求,这样就不会出现权限过大问题。事实上,现在很多软件,nginx,mysql,apache,vsftpd等几乎都是这样做的。

那么,怎么样在linux中更改子进程的运行身份呢?,实际上linux提供了这样的函数,来看一下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为系统中已经添加的用户),然后用ps aux|grep python查看系统当中运行的python程序,可以看到,有一个woker进程的身份已经改变了成为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的进程是用来处理请求的,那么一些属于root的权限就不会被进程调用,也可以通过设置文件的权限,对进程操作单个文件进行限制,达到比较好的权限控制效果,减少安全隐患。

Python 相关文章推荐
python类和继承用法实例
Jul 07 Python
Python中http请求方法库汇总
Jan 06 Python
Python之os操作方法(详解)
Jun 15 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
django的登录注册系统的示例代码
May 14 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Python调用.NET库的方法步骤
Dec 27 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
Python3爬虫RedisDump的安装步骤
Feb 20 Python
一起来学习Python的元组和列表
Mar 13 Python
使用Python编写Linux系统守护进程实例
Feb 03 #Python
Python中使用select模块实现非阻塞的IO
Feb 03 #Python
Python异常学习笔记
Feb 03 #Python
Python中的迭代器漫谈
Feb 03 #Python
Python描述器descriptor详解
Feb 03 #Python
理解Python中的With语句
Feb 02 #Python
Linux环境下MySQL-python安装过程分享
Feb 02 #Python
You might like
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
jquery.combobox中文api和例子,修复了上面的小bug
2011/03/28 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript模拟push
2016/03/06 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
bootstrap 设置checkbox部分选中效果
2017/04/20 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
Python简单连接MongoDB数据库的方法
2016/03/15 Python
python 循环while和for in简单实例
2016/08/16 Python
PyGame贪吃蛇的实现代码示例
2018/11/21 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
python可以用哪些数据库
2020/06/22 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
Skyscanner波兰:廉价航班
2017/11/07 全球购物
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
结婚典礼证婚词
2014/01/08 职场文书
2014年督导工作总结
2014/11/19 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
2015年保管员工作总结
2015/04/30 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS