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抓取网页图片并放到指定文件夹
Apr 24 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Python实现替换文件中指定内容的方法
Mar 19 Python
Python实现的质因式分解算法示例
May 03 Python
python3实现随机数
Jun 25 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
python利用 keyboard 库记录键盘事件
Oct 16 Python
python playwright 自动等待和断言详解
Nov 27 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)、调幅(AM)、短波(SW)、长波(LW)
2021/03/01 无线电
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
2017/02/05 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
JS调用打印机功能简单示例
2016/11/28 Javascript
详解vee-validate的使用个人小结
2017/06/07 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
vue中axios的二次封装实例讲解
2019/10/14 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
详解Django的CSRF认证实现
2018/10/09 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
python实现图片插入文字
2019/11/26 Python
python getopt模块使用实例解析
2019/12/18 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
预防煤气中毒方案
2014/06/16 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
解放思想演讲稿
2014/09/11 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
协议书格式模板
2016/03/24 职场文书
python执行js代码的方法
2021/05/13 Python
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS