Skip to content

Sessions, File Transfer & Supervision ​

Everything that happens when someone actually reaches a host: the browser terminal, SFTP file transfer, what gets recorded, and what an administrator can do about a session that is already running.

The browser terminal ​

A session starts from Hosts (or the terminal icon inside Zabbix). SeyalRun resolves which credential you're entitled to use for that host, opens the SSH connection from terminal-service, and streams it to an xterm.js terminal over a WebSocket. The credential is unwrapped by the service — it is never sent to the browser.

Sessions are held open only while you're connected; they expire on the same two clocks as your login (SESSION_IDLE_MINUTES, SESSION_ABSOLUTE_HOURS — see Security Model).

Zones and jump hosts ​

If the target host sits in a zone with a gateway, SeyalRun builds the ProxyJump chain for you: the root ancestor zone's gateway connects first, and the target's own zone gateway is the last hop before the host. Nested zones are allowed; cycles are rejected when the zone is saved, not at connect time.

Command filtering ​

Commands are extracted as you submit them and matched against the command filters that apply to your user/host scope. Each filter has a command group (a set of regex patterns), a priority, and an action:

ActionEffect
allowExplicitly permit — useful as a high-priority exception above a broad deny
denyBlock the command; it never reaches the host
confirmPause and ask the operator to confirm before the command runs
default_denyA block-all marker for that scope: anything not explicitly allowed is denied

Every matched command is written to the session's command log and the audit log with the filter that matched and the action taken — including the ones that were denied, which are the interesting ones.

Filters are configured in Admin → Security (command groups first, then filters). They're fetched when the session opens and refreshed periodically, so tightening a filter affects sessions already running, not just new ones.

SFTP file transfer ​

Every SSH session carries a file browser: list, download, upload, rename, mkdir, and delete on the remote host, over the same authenticated session and the same authorization. Uploads support drag-and-drop.

Transfers are capped at 1 GiB per file and streamed in chunks, so a large file doesn't mean a large memory footprint. Both directions check the limit — an oversized download is refused before it starts, and an upload that grows past the limit mid-stream is cut off — and both refusals are audited with the path and size. edge-proxy allows 1 GiB + 1 MiB of body so the app's own limit is what you hit, and you get its message rather than a raw nginx 413.

Recording and playback ​

Sessions are recorded frame-by-frame and replayable from Sessions. Playback is a terminal replay, not a video file — you can read and copy text out of it.

Recordings can be tiered to S3: recording-service runs an hourly task that moves local recordings older than RECORDING_TIER_AFTER_DAYS to the configured bucket, and purges past retention. This only happens when an admin has routed the recording category to S3 in Admin → Log Backend — it is off until you ask for it.

Live supervision ​

An administrator (or the session's own owner) can join a session that is currently running. Three distinct capabilities, deliberately separated because they are different levels of intrusion:

CapabilityWhat it does
JoinWatch the session's output live, read-only. Anything a watcher types is dropped server-side and never reaches the SSH connection.
TakeoverSend input into the session. One controller at a time — and the operator is told, in their own terminal.
TerminateEnd the session from inside the joined view.

Takeover announces itself on purpose. A PAM that let an administrator silently drive someone else's shell would write audit rows naming the wrong person for every command typed.

Joining is audited too. A supervision feature that leaves no trace of the supervisor fails at the one question it exists to answer — who was watching?

Sessions can also be killed outright (DELETE) from the session list, and all of a user's sessions can be terminated at once when their access is revoked.

Who can do what ​

ActionWho
Open a session on a hostAnyone with an authorization granting ssh on that host
Transfer filesSame authorization, sftp action
Watch / take over / terminate someone else's sessionadmin, superadmin — or the session's owner

Being able to terminate any session is a strictly higher privilege than being able to merely watch one, which is why watching reuses the same gate rather than adding a separate grant.

For agents ​

AI agents do not get an interactive shell — there is no "run this command" MCP tool. An agent that must change a host does it through run_automation against an approved job template. See AI Agents & MCP.

Secure. Controlled. Automated. — Released under the Apache License 2.0.