Skip to main content

shellsafe

Run shell commands safely using Python 3.14 template strings. Values can never turn into commands.

from shellsafe import run

message = get_user_input()          # "fix; rm -rf ~"
run(t"git commit -m {message}")
# argv: ["git", "commit", "-m", "fix; rm -rf ~"]
# one command; the scary text is just an argument

Why this package exists

Python 3.14 added template strings (PEP 750). Now Python keeps your fixed text and your values separate at the language level.

Shell commands are the first place people want to use this. That is because f-strings inside shell commands have caused real security bugs for ten years:

subprocess.run(f"git commit -m {message}", shell=True)
# if message = "fix; rm -rf ~"  ->  two commands run. The second one is bad.

Python planned to solve this officially (PEP 787), but that plan was postponed. So today there is no standard way to run shell commands safely with templates. This package fills that gap.

Install

pip install shellsafe

Needs Python 3.14 or newer.

How to use

Run a command. Your values always stay one argument each:

from shellsafe import run

run(t"mkdir {path}")
run(t"docker build -t {tag} .", check=True, timeout=300)

Get the output as text:

from shellsafe import capture

res = capture(t"grep {pattern} {file}")
print(res.stdout, res.returncode)

Need pipes? Works on Linux and macOS. Your values are quoted safely first:

from shellsafe import shx

shx(t"cat {file} | wc -l")

Want to see exactly what will run?

from shellsafe import plan

print(plan(t"git commit -m {message}"))
# argv: ["git","commit","-m","fix; rm -rf ~"]

Safety rules

Case What happens
Any value you pass becomes one argument, exactly as given
Value used as the program name error: program names must be written as fixed text
Shell features on Windows error: we cannot make Windows safe this way, so we say no
RAW() misuse error: one value only, used as-is, no nesting

RAW(...) marks content you have already made safe by hand. It is loud and easy to find in code review, so trust is never hidden.

Limits

  • On Windows, commands with pipes do not work. Plain commands work fully.
  • Byte values are rejected. Decode them first.
  • We keep your command safe to build and run. Testing what your command does is still your job.

Needs

  • Python 3.14 or newer
  • Linux, macOS, Windows (pipes work on Linux and macOS only)

More

License: MIT

Download files

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

Source Distribution

shellsafe-0.1.1.tar.gz (14.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

shellsafe-0.1.1-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file shellsafe-0.1.1.tar.gz.

File metadata

  • Download URL: shellsafe-0.1.1.tar.gz
  • Upload date:
  • Size: 14.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for shellsafe-0.1.1.tar.gz
Algorithm Hash digest
SHA256 8dbbb4ac36e2df7862a192c7c84b7489e0b017a44f4c1460626811b769aaea8d
MD5 232d244f57f3cbb7a3a61c74872c6a2a
BLAKE2b-256 2d80fe8c5cb1fef93532386c2150751d83ff2d381b00bc49b017489bd87bf519

See more details on using hashes here.

Provenance

The following attestation bundles were made for shellsafe-0.1.1.tar.gz:

Publisher: release.yml on rahulXs/shellsafe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file shellsafe-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: shellsafe-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for shellsafe-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ce0c0d8f1ea4cc37958c450e7f9a654b9ef64df0aeacc5899c3e1a82309f27f0
MD5 50d50557fb715269bdd0f4e56742b6c3
BLAKE2b-256 3d89ad7fbec592613532fb515048e38d7ac2f791aa49b045eb39cbe77443f009

See more details on using hashes here.

Provenance

The following attestation bundles were made for shellsafe-0.1.1-py3-none-any.whl:

Publisher: release.yml on rahulXs/shellsafe

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

This release

0.1.1 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page