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搭建微信公众平台
Feb 09 Python
python之Socket网络编程详解
Sep 29 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
python os.path模块常用方法实例详解
Sep 16 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 Python
pandas按条件筛选数据的实现
Feb 20 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
javascript实现的listview效果
2007/04/28 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
基于jQuery实现在线选座之高铁版
2015/08/24 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
Python3爬虫关于代理池的维护详解
2020/07/30 Python
教师实习自我鉴定
2013/12/13 职场文书
就业协议书怎么填
2014/04/11 职场文书
校园演讲稿汇总
2014/05/21 职场文书
个人整改措施书面材料
2014/10/24 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript
win10更新失败无限重启解决方法
2022/04/19 数码科技