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求crc32值的方法
Oct 05 Python
python分析apache访问日志脚本分享
Feb 26 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
Python使用ftplib实现简易FTP客户端的方法
Jun 03 Python
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
Python中生成器和迭代器的区别详解
Feb 10 Python
详解python之heapq模块及排序操作
Apr 04 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
python中使用.py配置文件的方法详解
Nov 23 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
在Ajax中使用Flash实现跨域数据读取的实现方法
2010/12/02 Javascript
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
python单元测试unittest实例详解
2015/05/11 Python
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python2随机数列生成器简单实例
2017/09/04 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
德国综合购物网站:OTTO
2018/11/13 全球购物
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
数据库测试通常都包括哪些方面
2015/11/30 面试题
本科生学习总结的自我评价
2013/10/02 职场文书
师范应届生语文教师求职信
2013/10/29 职场文书
销售人员获奖感言
2014/02/05 职场文书
住房抵押登记委托书
2014/09/27 职场文书
爱护公物主题班会
2015/08/17 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python