DOCS · ADVANCED · REMOTE AI-AGENT ACCESS
Run Ether from Claude or OpenAI, over SSH
HYVE Ether OS is a full Linux-based operating system, so any AI agent that can open an SSH session — Claude Code, or an OpenAI-based agent — can log into your HYVE machine from another computer and operate it: run commands, launch programs, and edit files — and, where those surfaces are enabled, drive HYVE's own agent stack too. This guide sets that up the sovereign, security-first way.
READ THIS FIRST — THE ONE HARD RULE
Turn on SSH on your HYVE machine (the host)
On the HYVE Ether OS machine, open a terminal and enable the OpenSSH server:
# Install the SSH server if it isn't already present, then start it
sudo apt update && sudo apt install -y openssh-server
sudo systemctl enable --now ssh
# Confirm it's listening, and find this machine's address
systemctl status ssh --no-pager
hostname -I # your LAN IP is the 192.168.x.x or 10.x.x.x value (ignore 127.0.0.1)Write that address down — you'll use it (or the VPN address from Section 2) in every command below. Then create the login account the agent will use. A dedicated user is cleaner than reusing your own — it lets you scope and revoke agent access independently (Section 5):
# Recommended: a dedicated, low-privilege user for the agent
sudo adduser hyve-agentLeave this terminal open — you'll harden the SSH config in Section 3 once keys are in place.
Reach the host from another network — privately
To connect from a different network without opening any public port, put both machines on a private mesh. Two good options; the first is the fully-sovereign one.
A. WireGuard (self-hosted, no third party)
WireGuard is a tiny, fast VPN with no coordination server you don't control — the most sovereign choice. Install it on both machines and generate a key pair on each (the files land in your current directory):
sudo apt install -y wireguard
umask 077; wg genkey | tee privatekey | wg pubkey > publickeyNow write /etc/wireguard/wg0.conf on each machine. Each machine's PrivateKey is the contents of its own privatekey file; the [Peer] PublicKey is the other machine's publickey.
On the HOST — /etc/wireguard/wg0.conf
[Interface]
Address = 10.99.0.1/24
ListenPort = 51820
PrivateKey = <paste HOST privatekey>
[Peer]
PublicKey = <paste CONTROLLER publickey>
AllowedIPs = 10.99.0.2/32On the CONTROLLER — /etc/wireguard/wg0.conf
[Interface]
Address = 10.99.0.2/24
PrivateKey = <paste CONTROLLER privatekey>
[Peer]
PublicKey = <paste HOST publickey>
Endpoint = <host-public-ip-or-ddns>:51820
AllowedIPs = 10.99.0.1/32
PersistentKeepalive = 25Bring it up on both machines with sudo wg-quick up wg0. The host is then reachable at 10.99.0.1 from the controller.
WIREGUARD NEEDS ONE REACHABLE ENDPOINT
Endpoint above: a static or dynamic public IP, or a single forwarded UDP port (51820 is far safer to forward than SSH — it's a silent, unauthenticated-looking port with no login prompt to brute). If both machines sit behind home NATs with no forwarding at all, raw WireGuard can't link them — that is exactly the gap Tailscale (option B) closes for you.B. Tailscale (easiest)
Tailscale wraps WireGuard with automatic key exchange and NAT traversal, so it works even when both machines are behind home routers. It relies on a coordination service you don't host, so it's less sovereign than raw WireGuard — but it's the fastest to stand up. On both machines:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
# On the HOST, find its mesh address to SSH to:
tailscale ip -4 # its 100.x.y.z address
tailscale status # lists every machine on your tailnetIF YOU CANNOT USE A VPN AT ALL
PermitRootLogin no, AllowUsers scoped to just the agent account, a low MaxAuthTries, firewall rate-limiting, fail2ban, and ideally short-TTL SSH certificates instead of a standing key. Even then, fail2ban does little against key-scanning or an sshd zero-day — a VPN avoids the whole problem.Use SSH keys, then lock the door
On the controller (where the agent runs), generate a dedicated key pair — no password login, ever. Give it a passphrase when prompted:
ssh-keygen -t ed25519 -C "hyve-agent" -f ~/.ssh/hyve_ether
chmod 600 ~/.ssh/hyve_ether
# Copy the PUBLIC key to the host (replace user + address):
ssh-copy-id -i ~/.ssh/hyve_ether.pub hyve-agent@10.99.0.1THIS PRIVATE KEY IS THE CROWN JEWEL
~/.ssh/hyve_ether gets a shell on your HYVE machine — a stolen laptop, a synced folder, or a prompt-injected agent with file access. Protect it with a passphrase (load it into an ssh-agent so you type it once), keep it chmod 600, and never commit or sync it. For unattended agents, prefer a hardware-backed key (a security key) or short-lived SSH certificates over a bare passwordless key.%USERPROFILE%\.ssh\hyve_ether. Since ssh-copy-id isn't included on Windows, append the key by hand in PowerShell:type $env:USERPROFILE\.ssh\hyve_ether.pub | ssh hyve-agent@10.99.0.1 "cat >> ~/.ssh/authorized_keys"Confirm key login works, then turn passwords off. On the host, edit the SSH config:
sudo nano /etc/ssh/sshd_config
# Set (or add) these lines:
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
AllowUsers hyve-agent youradmin # include EVERY account you still need to reach
# Save, then apply:
sudo systemctl restart sshDON'T LOCK YOURSELF OUT
systemctl restart ssh: keep your current terminal open, and in a second window confirm a fresh key login works — ssh -i ~/.ssh/hyve_ether hyve-agent@10.99.0.1. Once passwords are off, anyone not in AllowUsers and without a key is locked out — so list your own admin account there too.If a firewall is on, allow SSH only from your private network — never from everywhere:
# Example: allow SSH only from the WireGuard subnet
sudo ufw allow from 10.99.0.0/24 to any port 22 proto tcpFrom the controller, you now connect with:
ssh -i ~/.ssh/hyve_ether hyve-agent@10.99.0.1Point the agent at the host
With SSH working, there are two clean ways to let Claude Code or an OpenAI agent operate the machine.
Pattern A — Run the agent ON the host (simplest, full power)
SSH in from the controller, then run your agent right there on HYVE Ether OS. It operates the machine locally with the login user's permissions:
ssh -i ~/.ssh/hyve_ether hyve-agent@10.99.0.1
# ...now on the HYVE machine, launch your agent, e.g.:
claude # Claude Code
# or an OpenAI-based CLI agent you've installed (aider, etc.)Pattern B — Drive the host FROM an agent on the controller
Keep the agent on your controller and give it a tool that runs a command on the host over SSH. Any agent that can call a shell command can use this — Claude Code, or an OpenAI function-calling agent:
# A "run on HYVE" tool the agent calls with a command string:
ssh -i ~/.ssh/hyve_ether hyve-agent@10.99.0.1 "<command>"
# e.g. the agent asks the OS what's running:
ssh -i ~/.ssh/hyve_ether hyve-agent@10.99.0.1 "uptime; systemctl status --no-pager"For Claude Code, expose that as a small MCP tool or a permitted Bash command; for an OpenAI agent, register it as a function whose argument is the command to run.
A RAW COMMAND TOOL IS ARBITRARY-CODE EXECUTION
hyve-agent user with no sudo.Optional — HYVE's native agent surfaces
HYVE Ether OS ships an MCP bridge that MCP-compatible agent tools can connect to, and it can act as an OpenAI-compatible model provider on your network. If you've enabled those in the OS's settings, you can also point an agent at HYVE's own AI over the same private VPN — no cloud, running on the hardware you own. Enable them from inside the OS first; the plain SSH paths above always work regardless.
Fence in what the agent can do
An SSH shell is total access. Scope it to your comfort level — especially if you don't fully trust every action the agent might take:
- Dedicated user, least privilege. Use the
hyve-agentaccount, not your own. Grant it only thesudorights it truly needs — ideally none. - Constrain the key — all three, together. In
~/.ssh/authorized_keys, prefix the agent's key withfrom="10.99.0.0/24"(source-IP fence),restrict(disables port-, agent-, and X11-forwarding and PTY — future-safe), andcommand="/usr/local/bin/agent-wrapper"(a script that runs only an allow-listed set of operations). They're orthogonal — one alone is not a jail. The client's requested command arrives in$SSH_ORIGINAL_COMMAND; your wrapper must validate or ignore it — never blindlyevalit. Example line:from="10.99.0.0/24",restrict,command="/usr/local/bin/agent-wrapper" ssh-ed25519 AAAA... hyve-agent - Watch it. SSH auth events are in the system journal —
journalctl -t sshd(orjournalctl -u ssh) — and, where you've enabled it, HYVE's own audit ledger gives every action a tamper-evident trail. - Kill it fast. To revoke access instantly: delete the agent's line from
authorized_keys, orsudo systemctl stop ssh, or drop the VPN.
THE SOVEREIGN POINT