代碼示例支持 |
---|
平臺: Centos 6.3 |
Python: 2.7.14 |
代碼示例: 菜單 - Python踩坑指南代碼示例 |
小明是個服務器管理員, 他從老管理員手裏接手了一個很是繁瑣的運維工做: 短暫受權root 帳號給不一樣的 team 接口人運行備份任務c++
該運維任務有幾個特色:bash
小明很是煩躁, 爲了填上這個坑, 他調研了填坑解法.服務器
填坑解法知足:併發
具體作法:運維
利用c/c++程序出借部分 root 權限 (完整代碼關注公號點擊菜單查看)ui
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權限借用code
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 代碼執行具體的備份任務orm
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()))
運行試驗:blog
uid / euid / suid 是什麼
gid, egid 等同理, [*]uid的判斷優先
爲何本文沒有直接對euid_backup.py文件進行設置+s操做, 而是用可執行的c/c++程序作執行器
Linux 系統裏的passwd 程序是否也是這個原理? 它跟哪些文件/命令相關
進程篇其五之眼花繚亂的進程間通訊
Life is short. We use Python.