ov-core/skills/ssh/SKILL.md
Generic SSH support for ov — `--host <alias>` re-execs any command on a remote machine; `ov ssh tunnel` exposes remote SPICE/VNC endpoints on the local host for external GUI apps.
npx skillsauth add overthinkos/overthink-plugins ov:sshInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
MUST be invoked before any work involving: ov --host <alias|target>
remote execution, ov ssh tunnel port forwarding for external SPICE/VNC
viewers, or managing host aliases via ov settings set hosts.<alias>.
ov --host <alias> — re-exec any ov command on a remote machineSet --host (or OV_HOST) at the top level of any ov invocation.
ov shells out to the system ssh binary, runs ov <rest of argv> on
the remote host, and streams stdin/stdout/stderr through. Exit code
propagates.
# Alias setup (once per workstation):
ov settings set hosts.o o.atrawog.org
ov settings set hosts.prod [email protected]:2222
# Any ov verb works:
ov --host o status
ov --host o start openclaw
ov --host o vm list
ov --host o deploy add host fedora-coder
ov --host o test spice status arch
ov --host o test spice screenshot arch - > /tmp/local.png # stdout pipes back
LocalOnly commands are NOT re-execed, even when --host is set:
ov settings …, ov version, ov ssh tunnel …. These manage the local
workstation (settings file, CLI version, local tunnel listener) and
would be meaningless on the remote host.
Transport: system ssh binary via os/exec, so ~/.ssh/config,
agent forwarding, and ControlMaster all work transparently. If your
target needs a specific key, set it in ~/.ssh/config — ov stays out
of SSH authentication.
Client-only flags stripped before re-exec: --host, --dir / -C,
--repo, --kdbx. These are workstation-local concerns and must not be
forwarded to the remote side.
ov ssh tunnel — expose a remote VM's display for external GUI appsFor apps that aren't ov (virt-viewer, remote-viewer with a bare URL,
TigerVNC, Spicy), open an SSH-forwarded local endpoint:
ov ssh tunnel spice <vm> [--uri qemu+ssh://user@host/session] [--tcp]
ov ssh tunnel vnc <vm> [--uri qemu+ssh://user@host/session] [--tcp]
Default mode preserves the wire format: UNIX socket in, UNIX socket out
(local path under /tmp/ov-tunnel-<id>.sock). --tcp forces a
127.0.0.1:<random> TCP listener for clients that don't understand
spice+unix:// / vnc+unix://.
$ ov ssh tunnel spice arch --uri qemu+ssh://o.atrawog.org/session
spice tunnel: spice+unix:///tmp/ov-tunnel-8e4c.sock
Connect with: remote-viewer spice+unix:///tmp/ov-tunnel-8e4c.sock
Press Ctrl-C to close the tunnel.
Blocks until SIGINT/SIGTERM; closes listener + SSH client cleanly on exit.
Not needed for virt-manager or remote-viewer --connect qemu+ssh://
— those auto-forward UNIX-socket listeners through libvirt's RPC
fd-passing, with zero ov involvement. See /ov-vms:arch.
| Command | Effect |
|---|---|
| ov settings set hosts.<alias> <ssh-target> | create/update alias |
| ov settings get hosts.<alias> | print resolved target |
| ov settings reset hosts.<alias> | delete alias |
| ov settings list | show all settings including host_aliases map |
<ssh-target> forms: host, user@host, user@host:port. When
resolving, plain words that look like aliases (no @, no .) are
looked up in hosts.*; anything else is treated as a raw ssh target
and passed through.
--hostov eval libvirt|spice|vnc --uri qemu+ssh://…
instead; it runs ov locally and forwards the display channel over SSH.ov isn't installed on the remote machine → use --uri or
ov ssh tunnel./ov-vms:arch — "Connecting from a remote workstation" —
the canonical worked example across all three paths./ov-build:settings — hosts.<alias> key schema./ov-advanced:spice — --uri + --socket flags on ov eval spice./ov-advanced:libvirt — --uri flag on every ov eval libvirt verb./ov-advanced:vnc — ov eval vnc vm <name> … subcommand group.tools
OpenCharly CLI (charly) binary installed into container/VM images for in-container use. Use when working with charly binary deployment inside containers, native D-Bus support, or the full charly toolchain (charly binary + virtualization + gocryptfs + socat).
development
Operator CachyOS workstation profile — a kind:local template + target:local deploy that installs the full dev stack (30 candies) onto a CachyOS host via ShellExecutor. Lives in the overthinkos/cachyos submodule. MUST be invoked before editing or applying the charly-cachyos workstation profile.
tools
Fedora box with the full charly toolchain using shared candies. Rootless-first — runs as uid=1000 with passwordless sudo (no root, no cap_add: ALL). Same candy list as charly-arch. Includes NVIDIA GPU runtime. MUST be invoked before building, deploying, configuring, or troubleshooting the charly-fedora box.
tools
Arch Linux box with the full charly toolchain. Rootless-first — runs as uid=1000 with passwordless sudo (no root, no cap_add: ALL). Composes /charly-coder:charly-mcp so the box is reachable as an MCP gateway on port 18765. NVIDIA GPU runtime composed in. MUST be invoked before building, deploying, configuring, or troubleshooting the charly-arch box.