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 相关文章推荐
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
Python使用SQLite和Excel操作进行数据分析
Jan 20 Python
python 实现UTC时间加减的方法
Dec 31 Python
解决python Markdown模块乱码的问题
Feb 14 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 Python
python 五子棋如何获得鼠标点击坐标
Nov 04 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
Feb 18 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
python中get和post有什么区别
Jun 19 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 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程序--记数器
2006/10/09 PHP
PHP的中问验证码
2006/11/25 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
jQuery入门知识简介
2010/03/04 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
简单介绍Python中的struct模块
2015/04/28 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
python网络爬虫 Scrapy中selenium用法详解
2019/09/28 Python
Python实现中值滤波去噪方式
2019/12/18 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
校园餐饮创业计划书
2014/01/10 职场文书
2015年党性分析材料
2014/12/19 职场文书
单位考核聘任报告
2015/03/02 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers