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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
Python使用MD5加密字符串示例
Aug 22 Python
Python装饰器基础详解
Mar 09 Python
Python Requests安装与简单运用
Apr 07 Python
浅谈flask中的before_request与after_request
Jan 20 Python
python socket网络编程之粘包问题详解
Apr 28 Python
python查看文件大小和文件夹内容的方法
Jul 08 Python
Python实现网页截图(PyQT5)过程解析
Aug 12 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
PHP 高级课程笔记 面向对象
2009/06/21 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP图片验证码制作实现分享(全)
2012/05/10 PHP
PHP精确计算功能示例
2016/11/29 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
Javascript实现的分页函数
2006/12/22 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
vue2项目使用sass的示例代码
2017/06/28 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
一分钟学会JavaScript中的try-catch
2020/12/14 Javascript
Python 字符串中的字符倒转
2008/09/06 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
Python内置函数delattr的具体用法
2017/11/23 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
迟到检讨书800字
2014/01/13 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
实例详解Python的进程,线程和协程
2022/03/13 Python
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python
Mysql中常用的join连接方式
2022/05/11 MySQL