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 内置函数complex详解
Oct 23 Python
基于Django的python验证码(实例讲解)
Oct 23 Python
和孩子一起学习python之变量命名规则
May 27 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
python实现复制大量文件功能
Aug 31 Python
python如何将两张图片生成为全景图片
Mar 05 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
python模块如何查看
Jun 16 Python
Python如何使用logging为Flask增加logid
Mar 30 Python
解决pytorch读取自制数据集出现过的问题
May 31 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
python Django模板的使用方法(图文)
2013/11/04 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
意大利网上药房:Farmacia 33
2020/01/27 全球购物
c语言常见笔试题总结
2016/09/05 面试题
机电一体化专业应届生求职信
2013/11/27 职场文书
士力架广告词
2014/03/20 职场文书
《法国号》教学反思
2016/02/22 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS