代码示例支持 |
---|
平台: Centos 6.3 |
Python: 2.7.14 |
代码示例: 公众号点击 踩坑之旅菜单 或者 https://github.com/mythmgn/awesome_py_traps |
小明是个服务器管理员, 他从老管理员手里接手了一个很是繁琐的运维工做: 短暂受权root 帐号给不一样的 team 接口人运行备份任务c++
该运维任务有几个特色:git
小明很是烦躁, 为了填上这个坑, 他调研了填坑解法.github
填坑解法知足:bash
具体作法:服务器
利用c/c++程序出借部分 root 权限 (完整代码关注公号点击菜单查看)并发
int main(int argc, char **argv){ if(0==isRunUnderRoot()){ fprintf(stderr,"does not run under +S attribute. Exiting....\n"); return EXIT_FAILURE; } exit(runNewProcess("./", "env python ./euid_backup.py")); }
为生成的执行文件euid_cp及euid_backup.py 设置root权限借用运维
sudo rm -f ./euid_cp sudo gcc euid_cp.c -o euid_cp # 设置文件owner为root, 非root用户没法更改执行内容 sudo chown root euid_cp euid_backup.py # 设置a. 非root只读 b. 增长执行权限 sudo chmod 755 euid_cp # 设置stick bit, 执行euid_cp便可短暂获取root 权限, 执行任务 sudo chmod +s euid_cp
euid_backup.py Python 代码执行具体的备份任务ui
from __future__ import print_function import os import time print('euid is {0}'.format(os.geteuid())) if os.geteuid() == 0: print('start to copy under root') print('do some operations here') time.sleep(2) print('end copying things') print('drop privileges from root') else: print('non-root, euid {0} will exit'.format(os.geteuid()))
运行试验:code
uid / euid / suid 是什么
gid, egid 等同理, [*]uid的判断优先
为何本文没有直接对euid_backup.py文件进行设置+s操做, 而是用可执行的c/c++程序作执行器
Linux 系统里的passwd 程序是否也是这个原理? 它跟哪些文件/命令相关
进程篇其五之眼花缭乱的进程间通讯
Life is short. We use Python.