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操作时间和日期之asctime()方法的使用
May 22 Python
Python队列的定义与使用方法示例
Jun 24 Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 Python
python编程嵌套函数实例代码
Feb 11 Python
使用python绘制二元函数图像的实例
Feb 12 Python
Python简单I/O操作示例
Mar 18 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
使用Python测试Ping主机IP和某端口是否开放的实例
Dec 17 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
python爬取网页版QQ空间,生成各类图表
Jun 02 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安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
js函数排序的实例代码
2013/07/01 Javascript
jquery实现邮箱自动补全功能示例分享
2014/02/17 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
浅谈JS验证表单文本域输入空格的问题
2017/02/14 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python对象与json相互转换的方法
2019/05/07 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
Python错误的处理方法
2020/06/23 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
大学活动邀请函
2014/01/28 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
爱情寄语大全
2014/04/09 职场文书
2014年村委会工作总结
2014/11/24 职场文书
搞笑结婚保证书
2015/05/08 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
运动会加油稿30字
2015/07/21 职场文书
国际贸易实训总结
2015/08/03 职场文书