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中的装饰器、闭包和functools的教程
Apr 02 Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 Python
Python实现股市信息下载的方法
Jun 15 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
python 实现分组求和与分组累加求和代码
May 18 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
keras.utils.to_categorical和one hot格式解析
Jul 02 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
Python jiaba库的使用详解
Nov 23 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
改变Apache端口等配置修改方法
2008/06/05 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
pandas通过索引进行排序的示例
2018/11/16 Python
更新修改后的Python模块方法
2019/03/03 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
财务总监管理职责范文
2014/03/09 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
副科级后备干部考察材料
2014/05/15 职场文书
淘宝店策划方案
2014/06/07 职场文书
班级心理活动总结
2014/07/04 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL
react中的DOM操作实现
2021/06/30 Javascript
英镑符号 £
2022/02/17 杂记