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实现的简单文件传输服务器和客户端
Apr 08 Python
Python 26进制计算实现方法
May 28 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
python 文件操作api(文件操作函数)
Aug 28 Python
django批量导入xml数据
Oct 16 Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
django基于restframework的CBV封装详解
Aug 08 Python
python多线程实现TCP服务端
Sep 03 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
Python之指数与E记法的区别详解
Nov 21 Python
关于numpy数组轴的使用详解
Dec 05 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+iframe实现隐藏无刷新上传文件
2012/02/10 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
Yii获取当前url和域名的方法
2015/06/08 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
vue项目中v-model父子组件通信的实现详解
2017/12/10 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
python程序文件扩展名知识点详解
2020/02/27 Python
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
SmartBuyGlasses比利时:购买品牌太阳镜和眼镜
2019/08/09 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
元宵节晚会主持人串词
2014/03/25 职场文书
最新离婚协议书范本
2014/08/19 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
中标通知书格式
2015/04/17 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
思想品德课教学反思
2016/02/24 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript