TurboSSH logo TurboSSH
TurboSSH

TurboSSH

SSH, serial, SFTP and a remote camera for people who live on embedded and automotive boxes. One toolkit β€” a Python library, a CLI, and a desktop GUI with a real VT100 terminal.

Direct & jump-host SSH Native serial-over-RDP Remote webcam over SSH Offline OpenSSH install Keyword highlighting MIT licensed
$ pip install turbossh

What it does

Everything below is available three ways β€” from the Python library, the command line, and the desktop app.

πŸ”Œ

SSH, jump hosts, legacy gear

Connect directly, through an RDP/Windows jump box, or to old ECUs that only speak deprecated crypto. Typed results β€” exit code, stdout, timing.

πŸ“œ

Live logs

slog2info -w, journalctl -f, dmesg -w streamed line by line, with regex matching, stop-on-match and tee-to-file.

πŸ“

SFTP & SCP

A full remote-filesystem API and a graphical browser under every session. Transfers run on their own channel, so nothing blocks.

πŸ–₯️

Native serial over RDP

Open a COM port plugged into the remote Windows box and type into it like a real terminal β€” Tab-completion, Ctrl-C, the lot.

πŸ“·

Camera β€” local or remote

View a webcam on this PC or on a remote machine, with snapshot, record, pause and rotate. Sharp native MJPEG over a clean SSH tunnel.

πŸ”Ž

Scan remote ports

Ask the machine you're about to connect to which COM ports it actually has, with friendly device names.

πŸ–§

Offline OpenSSH install

Stand up sshd on a locked-down Windows box with no internet β€” on the machine itself, or to a remote one over WinRM.

πŸš‡

Port forwarding

ssh -L tunnels through the same connection or jump host, straight from the CLI or library.

🎨

Keyword highlighting

MobaXterm-style colouring of error / warning / success in the terminal β€” on top of the server's own ANSI colours, never replacing them.

πŸͺŸ

The desktop app

Tabbed & split sessions, SFTP browser, log viewer, light/dark theme, 10k-line scrollback, and save-the-whole-session-to-disk.

πŸ”

Credentials in the vault

Passwords live in the OS keyring and are masked in logs β€” never in plaintext in your scripts or on disk.

πŸ”

Auto-reconnect

Dropped SSH sessions retry on their own for 30 s, then wait for a single Ctrl‑R β€” handy across target reboots.

Quick start

The same handler works as a library inside a test framework or as a one-off command in a shell script.

# Python β€” in a test framework
from turbossh import SSHHandler, SSHConfig

with SSHHandler(SSHConfig(
        host="192.168.1.50",
        username="root", password="…")) as ssh:
    print(ssh.run("uname -a").text)
    ssh.push("build/app", "/tmp/app")
    ssh.stream("slog2info -w", on_line=print)
# CLI β€” in a shell script
$ turbossh run    --host H --user U uname -a
$ turbossh stream --host H --user U slog2info -w
$ turbossh serial-ssh --host H --user U \
      --device COM4 --baud 115200 --save log.txt
$ turbossh camera-grab --camera "C615" --out shot.jpg

# or just launch the desktop app
$ turbossh-gui

Complete CLI reference

Every command the turbossh tool ships with. Run any of them with --help for the full list of options.

Run & inspect
turbossh runSSH

Execute one command on the target and print the result. Returns the remote exit code; add --json for a machine-readable object.

turbossh run --host 192.168.1.50 --user root --password uname -a
turbossh run --host ecu --user root --use-stored --json -- systemctl is-active sshd

Args: positional command…  Β·  plus the common connection flags.

turbossh infoSSH

Connect and report what the remote box is β€” OS family, kernel, architecture. A quick "can I reach it and who is it?" probe.

turbossh info --host 10.0.0.7 --user root --password

Args: the common connection flags.

Files β€” SFTP / SCP
turbossh pushSSH

Upload a file or directory to the target over SFTP.

turbossh push --host H --user root --recursive ./build /opt/app

Args: positional local remote  Β·  --recursive for directories  Β·  plus the common flags.

turbossh pullSSH

Download a file or directory from the target.

turbossh pull --host H --user root /var/log/messages ./messages.log
turbossh pull --host H --user root --recursive /var/log ./logs

Args: positional remote local  Β·  --recursive  Β·  plus the common flags.

Live logs
turbossh streamSSH

Run a never-ending command (tail -f, slog2info -w, journalctl -f) and print lines live. Flag matches with a regex, tee to a file, and optionally stop on the first hit.

turbossh stream --host H --user root \
   --match "panic|oops|segfault" --save boot.log slog2info -w

Args: positional command…  Β·  --match REGEX  Β·  --save FILE  Β·  --stop-on-match  Β·  plus the common flags.

Serial
turbossh list-seriallocal

List the serial / COM ports on this machine.

turbossh list-serial

Args: none.

turbossh serial-monitorlocal

Monitor a serial port wired to this machine, live, with match and save. Optionally send a line before listening.

turbossh serial-monitor --port COM5 --baud 115200 --save console.log

Args: --port (e.g. COM5 or /dev/ttyUSB0)  Β·  --baud  Β·  --match  Β·  --save  Β·  --stop-on-match  Β·  --timeout.

turbossh serial-sshSSH

Monitor a serial port that is plugged into the remote host, tunnelled over SSH β€” the headline trick for COM ports on an RDP jump box.

turbossh serial-ssh --host rdpbox --domain EU --user me --password \
   --device COM4 --baud 115200 --send "reboot" --save uart.log

Args: --device (remote port, e.g. COM4 or /dev/ser1)  Β·  --baud  Β·  --send LINE  Β·  --match  Β·  --save  Β·  --stop-on-match  Β·  plus the common flags.

turbossh scan-portsSSH

List the serial ports on the remote host over SSH, with friendly device names β€” so you know what to pass to serial-ssh --device.

turbossh scan-ports --host rdpbox --domain EU --user me --password

Args: the common connection flags.

Camera
turbossh camera-listlocalSSH

List the cameras on this machine, or β€” with --host β€” on a remote one over SSH.

# this PC
turbossh camera-list
# a remote RDP box
turbossh camera-list --host rdpbox --domain EU --user me --password

Args: --ffmpeg (local ffmpeg path)  Β·  --remote-ffmpeg  Β·  plus the common flags when using --host.

turbossh camera-grablocalSSH

Save a snapshot (.jpg) or a short clip (.mp4 with --seconds) from a camera, local or remote.

# single snapshot from a local camera
turbossh camera-grab --camera "Logitech C615" --out shot.jpg
# 10-second 720p clip from a remote camera
turbossh camera-grab --host rdpbox --domain EU --user me --password \
   --camera "USB Camera" --out clip.mp4 --seconds 10 --width 1280 --fps 30

Args: --camera NAME (from camera-list)  Β·  --out FILE  Β·  --seconds (0 = snapshot)  Β·  --width  Β·  --fps  Β·  --ffmpeg / --remote-ffmpeg  Β·  plus the common flags.

Server, tunnels & credentials
turbossh setup-serverWindows

Install and start OpenSSH Server on this Windows machine, fully offline from the bundled package. Self-elevates to Administrator. Also available as the standalone command turbossh-setup.

turbossh setup-server     # or:  turbossh-setup

Args: none β€” it prompts for the UAC elevation and reports back.

turbossh install-ssh-remoteWinRM

Push the bundled OpenSSH to a remote Windows host over WinRM and install it there β€” no downloads on the target.

turbossh install-ssh-remote --host rdpbox --domain EU --user Administrator

Args: --host  Β·  --user (a local admin on the target)  Β·  --domain  Β·  --ssh-port  Β·  --winrm-port.

turbossh forwardSSH

Open a local port-forward (ssh -L) through the connection or jump host β€” reach a service that's only visible from the SSH server.

turbossh forward --host jump --user me --password \
   --local-port 8080 --to-host 10.0.0.9 --to-port 80

Args: --local-port  Β·  --to-host (reachable from the SSH server)  Β·  --to-port  Β·  plus the common flags.

turbossh store-credentialvault

Save a password into the OS credential vault once, then use --use-stored on any command instead of typing it.

turbossh store-credential --user root --service turbossh-sessions

Args: --user  Β·  --domain  Β·  --service (vault namespace).

Common connection flags

Shared by every SSH command above (run, info, push, pull, stream, serial-ssh, scan-ports, forward, and the camera commands when remote).

FlagMeaning
--hostTarget host or IP (required).
--portSSH port (default 22).
--userUsername (required).
--domainWindows domain, e.g. EU for an EU\me login.
--keyPath to a private-key file.
--passwordPrompt for the password (hidden input).
--use-storedRead the password from the OS vault instead of prompting.
--serviceVault namespace for --use-stored / store-credential.
--timeoutConnect timeout in seconds.
--no-fast-authDisable the fast single-attempt auth path (for fussy servers).
--jsonEmit machine-readable JSON instead of text.
Other installed commands
CommandWhat it does
turbossh-guiLaunch the desktop app.
turbossh-setupInstall OpenSSH Server on this Windows machine (same as setup-server).
turbossh-shortcutCreate a Desktop / Start-Menu shortcut for the GUI.
turbossh-docsOpen this documentation in your browser.

Camera β€” local or remote, over SSH

View a webcam on this PC or on a remote RDP/Windows box, right inside TurboSSH β€” to eyeball a bench rig, a dashboard cluster, or a board's status LEDs without walking to the lab.

In the desktop app

Open the Camera panel from the ribbon πŸ“· button or the File menu, then:

  1. Pick a source β€” Local (this PC) or Remote (choose a saved RDP machine; host/user prefill from your jump host).
  2. Choose the camera, resolution and fps.
  3. Set the View mode β€” Fill, Fit or Stretch β€” and Rotate 0/90/180/270Β° if the camera is mounted sideways.
  4. Snapshot, Record to MP4, or Pause. Right-click the image to copy the current frame to the clipboard.

From the command line

No GUI needed β€” list and grab from scripts:

turbossh camera-list
turbossh camera-grab --camera "C615" --out shot.jpg
turbossh camera-grab --host rdpbox --user me --password \
   --camera "USB Camera" --out clip.mp4 --seconds 8
How it works
Remote streamMJPEG frames travel over a binary-clean SSH tunnel, so Windows' shell can't corrupt the video.
SharpnessCaptures the camera's largest native MJPEG mode and passes it through β€” no blurry upscaling.
ffmpegFetched once (~160 MB) and cached under ~/.turbossh; or point at your own with --ffmpeg / the Camera settings page.
RecordingWhole JPEG frames are muxed to a clean H.264 MP4 with wall-clock timing.
Tip: on a remote box, run turbossh camera-list --host … first to get the exact camera name to pass to --camera.

The desktop app

A real terminal, not a text box. Launch it with turbossh-gui, or grab the single-file Windows .exe from the releases page β€” no Python required.

πŸ–₯️ Real VT100 terminal

Full-screen apps β€” vim, htop, less, nano β€” render correctly, with 10k-line scrollback and "save the whole session to disk".

πŸͺŸ Tabbed & split sessions

Drag the dividers to resize a 2-, 3- or 4-way split; per-pane close buttons; a Home tab with quick actions and your saved sessions.

🎨 One-click theming & highlighting

Flip light/dark from the ribbon (the app and taskbar icon follow). Keyword highlighting tints error/warning/success on top of the server's colours β€” toggle under Settings β†’ Appearance.

πŸ“ SFTP browser & πŸ“œ log viewer

Browse, upload and download in a panel under each session; a log dock with debug/info/warn/error/success levels and a filter.

⚑ Quick commands & πŸ” auto-reconnect

Per-session buttons for the commands you run constantly (mount, reset, …); dropped SSH sessions reconnect on their own, then on Ctrl-R.

Keyword highlighting in action β€” the server's own colours are kept, these plain words get tinted:

[ OK ] Started OpenSSH server daemon.
[ OK ] Reached target Multi-User System.
br0: link ready, 1000 Mbps full duplex
nvme0: I/O error, dev nvme0n1, sector 0
kernel: warning: CPU3 thermal throttle
sshd: authentication failure for root
app: self-test passed β€” system ready
On Windows ARM64, where PyQt5 has no pip wheel, download the prebuilt turbossh-gui.exe from the latest release and run it directly.

The Python API

Everything the CLI and GUI do is the same handler underneath β€” drop it straight into a pytest suite or an automation script.

# connect β€” direct or through a jump host
from turbossh import SSHHandler, SSHConfig

cfg = SSHConfig(
    host="target", username="root",
    jump_host=SSHConfig(host="rdpbox",
        username="EU\\me", password="…"))

with SSHHandler(cfg) as ssh:
    r = ssh.run("systemctl is-active sshd")
    assert r.ok, r.text          # exit==0
    ssh.sudo("mount -o remount,rw /")
# files, logs, serial, tunnels
ssh.push("dist/", "/opt/app", recursive=True)
ssh.pull("/var/log", "logs/")
text = ssh.read_text("/proc/version")

ssh.stream("slog2info -w", on_line=print,
           match=r"E/.*panic", save_to="boot.log")

# a COM port on the remote Windows box
ports = ssh.remote_serial_ports()
ssh.serial_stream("COM4", baudrate=115200,
                  on_line=print, save_to="uart.log")

# local port-forward (ssh -L)
ssh.forward(local_port=8080,
            to_host="10.0.0.9", to_port=80)
Credentials stay safe: passwords are wrapped so they never appear in repr(), logs or tracebacks, and can live in the OS keyring instead of your source.

Get it

Pick whichever fits how you work.

pip

Library + CLI + the GUI launcher.
pip install turbossh then turbossh-gui.

Windows .exe

The GUI as a single self-contained executable β€” download the latest release, no Python needed.

Docs & source

Read the full README, the changelog, and the architecture notes.

↑ Top