A modern, high-performance SSHv2 and SFTP client/server library
Project description
SpindleX
A modern, high-performance SSHv2 and SFTP library.
Explore the Docs »
Quick Start
•
Migration Guide
•
Cookbook
•
Performance
•
Security
•
Contributing
SpindleX is a modern SSH protocol implementation engineered for speed, security, and a seamless developer experience. It provides a significantly more performant and cleaner alternative to legacy Python SSH libraries.
✨ Key Features
- 🚀 High Performance: Optimized protocol implementation with internal buffering designed for high-throughput SFTP and command execution.
- 📦 Modern Architecture: Clean, modular codebase built from the ground up for maintainability. Leverages the industry-standard
cryptographylibrary for robust, hardware-accelerated security. - 🔄 Native Async: First-class support for
asynciowithAsyncSSHClientandAsyncSFTPClient. - 🛡️ Secure by Default: Modern algorithms like Ed25519, ECDSA, and ChaCha20-Poly1305 are prioritized. Legacy SHA-1 and weak ciphers are disabled in the default configuration.
- 🏷️ Fully Typed: 100% type-hinted codebase for robust IDE integration.
🚀 Quick Start
Installation
# Using pip
pip install spindlex
# Using uv (recommended)
uv pip install spindlex
Basic Usage
Synchronous Example
from spindlex import SSHClient
from spindlex.hostkeys.policy import AutoAddPolicy
with SSHClient() as client:
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect('example.com', username='admin')
stdin, stdout, stderr = client.exec_command('uptime')
print(f"Status: {stdout.read().decode().strip()}")
Asynchronous Example
import asyncio
from spindlex import AsyncSSHClient
async def run():
async with AsyncSSHClient() as client:
await client.connect('example.com', username='admin')
stdin, stdout, stderr = await client.exec_command('uptime')
print(await stdout.read())
asyncio.run(run())
⚡ Performance
SpindleX is designed for high-throughput, low-latency environments. It utilizes internal read buffering (32KB chunks) and optimized packet handling to reduce system call overhead and improve protocol efficiency.
While performance varies significantly based on network conditions and hardware, SpindleX aims to provide a modern, efficient alternative to legacy Python SSH implementations.
[!TIP] Use the included
spindlex-benchmarktool to evaluate performance in your specific environment.
🛡️ Security
- Hardened Defaults: Modern cryptographic primitives are used by default. Legacy algorithms are disabled unless explicitly configured.
- Mandatory Verification: Host key verification is enforced unless explicitly overridden.
- Privacy Aware: Built-in log sanitizers ensure credentials never reach telemetry.
- Vulnerability Reporting: See meta/SECURITY.md.
🤝 Contributing
Contributions are welcome! See meta/CONTRIBUTING.md to get started.
📄 License
SpindleX is released under the MIT License. See LICENSE for the full text.
© 2024 SpindleX Project
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spindlex-0.5.0.tar.gz.
File metadata
- Download URL: spindlex-0.5.0.tar.gz
- Upload date:
- Size: 126.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
78bdbbea3738acc8e8c0ea53183eed1649379d1d2f11391fba80652156da8263
|
|
| MD5 |
d2eed7b288b023692ee9033f89a286e3
|
|
| BLAKE2b-256 |
75ccaac145cd407c1f5e1064b6d198bd4e6e9dff7017fb24101e8c205ae6dbd9
|
Provenance
The following attestation bundles were made for spindlex-0.5.0.tar.gz:
Publisher:
release.yml on Di3Z1E/spindlex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spindlex-0.5.0.tar.gz -
Subject digest:
78bdbbea3738acc8e8c0ea53183eed1649379d1d2f11391fba80652156da8263 - Sigstore transparency entry: 1279691557
- Sigstore integration time:
-
Permalink:
Di3Z1E/spindlex@5672c02e8aadbca7c598d23c994dcc395d1b7597 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Di3Z1E
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5672c02e8aadbca7c598d23c994dcc395d1b7597 -
Trigger Event:
release
-
Statement type:
File details
Details for the file spindlex-0.5.0-py3-none-any.whl.
File metadata
- Download URL: spindlex-0.5.0-py3-none-any.whl
- Upload date:
- Size: 126.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91d4efa02024e14d34f922e518da3c0cb7e92ec43d948391c6e88c9354077bb7
|
|
| MD5 |
1c4e7ba9f7615b1e963fd36612544f34
|
|
| BLAKE2b-256 |
60743dbfb96e52a9e3664f6af32856550095b08306b26a9f0620cff60653c67a
|
Provenance
The following attestation bundles were made for spindlex-0.5.0-py3-none-any.whl:
Publisher:
release.yml on Di3Z1E/spindlex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spindlex-0.5.0-py3-none-any.whl -
Subject digest:
91d4efa02024e14d34f922e518da3c0cb7e92ec43d948391c6e88c9354077bb7 - Sigstore transparency entry: 1279691603
- Sigstore integration time:
-
Permalink:
Di3Z1E/spindlex@5672c02e8aadbca7c598d23c994dcc395d1b7597 -
Branch / Tag:
refs/tags/v0.5.0 - Owner: https://github.com/Di3Z1E
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5672c02e8aadbca7c598d23c994dcc395d1b7597 -
Trigger Event:
release
-
Statement type: