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中Genarator函数用法分析
Apr 08 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
详解Python中的条件判断语句
May 14 Python
Python批量修改文本文件内容的方法
Apr 29 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
Python解决走迷宫问题算法示例
Jul 27 Python
python使用phoenixdb操作hbase的方法示例
Feb 28 Python
详解python数据结构和算法
Apr 18 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
乱谈我对耳机、音箱的感受
2021/03/02 无线电
介绍php设计模式中的工厂模式
2008/06/12 PHP
php基础学习之变量的使用
2011/06/09 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
php制作文本式留言板
2015/03/18 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
HTML5新标签兼容——> 的两种方法
2018/09/12 HTML / CSS
伦敦一卡通:The London Pass
2018/11/30 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
英国领先的名牌服装折扣零售商:Brown Bag Clothing
2019/01/08 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
银行会计财务工作个人的自我评价
2013/10/29 职场文书
2014年药店店长工作总结
2014/11/17 职场文书
个人先进事迹材料
2014/12/29 职场文书
检讨书范文
2015/01/27 职场文书
青年教师个人总结
2015/02/11 职场文书
法院执行局工作总结
2015/08/11 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python