Remote execution, without handing out shell access
Scheduled work has to reach other machines. What Xi-Exec adds to shared keys and service accounts, and why an auditor cares.
What the usual answers cost
Scheduled work rarely stays on one host. A backup has to be quiesced on the database server, a file has to be collected from the transfer host, a service has to be restarted in another data centre.
The usual arrangements are all variations on one theme: give something the ability to run arbitrary commands somewhere else.
A shared SSH key with a service account
Convenient, and it means anyone who can read the key can run anything that account can run. Rotation is a project nobody schedules.
A service account with a shell
Now the blast radius is 'everything that account can do', and the audit question 'who ran that, and when' has no good answer.
An SSH command that grew into an interface
It started as one script. It now takes arguments, and the arguments are not validated, and it is load-bearing.
A monitoring or configuration tool used for the purpose
It works, and it was designed for a different threat model, and it usually has more privilege than the job needs.
None of these is negligent. They are what you build when the requirement is real and the alternatives are expensive.
What it should look like instead
The list below is what Xi-Exec provides. It is also a reasonable specification for anything you would build or buy for this purpose.
The remote host decides what may run. Not the caller, and not whoever holds a credential. Each agent defines the exact set of scripts it will run, and nothing outside that set can be invoked regardless of credentials. No shell is exposed.
Both ends authenticate cryptographically. Mutual TLS, certificates managed automatically, no shared passwords and no key distribution problem.
Authorisation is evaluated per request, centrally. Not just 'is this caller known' but 'may this caller run this script, with these arguments, at this time of day, inside this change window'. Integrating with the identity infrastructure you already have - LDAP, OIDC - rather than a second set of accounts.
Every operation is logged on both sides. A correlated request ID, the script name, the arguments, the caller's identity and the exit code - recorded on the controller and on the agent, and not clearable by the operator who ran it.
One command reaches many hosts. Dispatch to a fleet simultaneously and collect structured results, so routine operations and incident response do not become a loop over hostnames.
Small enough to install everywhere. Minimal dependencies, no external package registries required at install or at runtime.
What a controlled execution layer has to do
The other two comparisons in this section set the standard tool against the
product feature by feature. The same table for remote execution, taking ssh
with a shared key as the baseline because it is what most sites are actually
running.
| Capability | ssh and a shared key | Xi-Exec |
|---|---|---|
| Run a named script on a remote host | Yes | Yes |
| Run across many hosts in parallel | Scripted by hand | Yes |
| Restrict the callable surface to a fixed set | ForceCommand, per key |
Yes, an allowlist on the agent |
| Decided by the target host rather than the caller | No | Yes |
| No shell exposed on the target | No | Yes |
| Arguments constrained and validated | No | Yes, per-script argument schemas |
| Per-operation authorisation policy | No | Yes, an auth hook at dispatcher and agent |
| Identity carried cryptographically | Key, not identity | Yes, mutual TLS |
| Central access control | No | Yes |
| LDAP or OIDC integration | No | Yes |
| Structured audit log with a correlated request id | Session logs only | Yes |
| Audit trail the caller cannot alter | No | Yes |
| Credential rotation | Key distribution across every host | Certificate renewal, per agent |
| Runs with no agent on the target | Yes | No, an agent is required |
| REST API | No | Yes |
Two rows are worth reading together. ssh needs nothing installed on the target
and Xi-Exec needs an agent: that is a real cost, and it is what buys every row
above it. The invariant the agent enforces is that a holder of a valid
dispatcher certificate can invoke the approved actions and nothing else, and
cannot alter the allowlist, the policy or the audit trail - even with full
control of the dispatcher.
The alternatives, side by side
These are the options a team actually weighs, and what each one costs in practice. Everything here is a real evaluation rather than a competitor scorecard: several of these are perfectly good tools being asked to do a job they were not designed for.
| Approach | What it gives you | What it costs |
|---|---|---|
| Shared SSH key and service account | Works immediately, nothing to install | Anyone who can read the key runs anything that account can. Rotation is a project nobody schedules. |
| Service account with a shell | Flexible, familiar | Blast radius is everything the account can do. "Who ran that, and when" has no good answer. |
SSH with ForceCommand |
Restricts a session to one command, which is the right instinct | Per key, not per operation, so per-script granularity is awkward. Key management remains. No structured logging. |
| Fabric, Paramiko and similar wrappers | Scriptable, familiar to developers | SSH underneath, so key management and access control are inherited. Adds a language runtime to every host. |
| Configuration management (Ansible, Salt, Puppet) | Excellent at what it is for | Designed for convergence, not task execution. Control-plane and dependency footprint out of proportion to running a script. |
| A management API per service | Precise for that service | Per service rather than general, with no consistent authorisation or logging model across them. |
| Xi-Exec | A named operation, on a known host, by a known identity, logged | Requires an agent on each target host and a one-time pairing step per host. |
The distinction that decides it: none of the first six gives you remote procedure call. They give you remote shell, and then ask you to fence it in afterwards. Xi-Exec starts from the operation.
Where this sits in the cycle
Xi-Exec is the layer between scheduling and output.
Xi-Batch schedules the work and decides when it should run. Xi-Exec carries it to the hosts where it has to happen, without handing out shell access. Xi-Text takes the output and delivers it.
Each is useful alone. Together they are the whole of the nightly run, from one supplier, with one support contract.