Implement remote execution
This commit is contained in:
@@ -65,6 +65,13 @@ hello-agent.exe --server # user session, SYSTEM token
|
||||
│ The server's first valid sig flips that peer to
|
||||
│ `managed=1` and unsigned posts get 401 from then on.
|
||||
│ Spec: rustdesk-server/docs/AGENT-API-AUTH.md
|
||||
├── exec::run_loop (background thread)
|
||||
│ └─ subscribes to sync.rs's EXEC_SENDER broadcast; for
|
||||
│ each queued PowerShell command runs `powershell.exe
|
||||
│ -NoProfile -NonInteractive -Command -`, captures
|
||||
│ stdout+stderr with 1 MiB cap & 5-min timeout, POSTs
|
||||
│ signed result to /api/agent/exec-result. Idle unless
|
||||
│ an admin dispatches via the dashboard.
|
||||
├── inventory::collect_inventory (background thread)
|
||||
│ └─ PowerShell + WMI + wlanapi + ipify → `INVENTORY` global
|
||||
│ consumed by hbbs_http::sync above; one-shot, no retry
|
||||
@@ -121,11 +128,14 @@ inventory — keep it in sync when adding new patches.
|
||||
upstream's connection-manager IPC loop and inherit file-transfer,
|
||||
chat, and clipboard handling rather than re-implementing them.
|
||||
* `mod hbbs_http` → `pub mod hbbs_http` so hello-agent's
|
||||
`unattended_password::try_report` can reach
|
||||
`librustdesk::hbbs_http::sign::build_signed_headers` — without
|
||||
this the in-crate POST can't sign and the build fails with
|
||||
`unattended_password::try_report` and `exec::run_loop` can reach
|
||||
`librustdesk::hbbs_http::sign::build_signed_headers` and
|
||||
`librustdesk::hbbs_http::sync::exec_signal_receiver`. Without
|
||||
this the in-crate code can't sign / can't subscribe to the
|
||||
server's queued PowerShell commands, and the build fails with
|
||||
`E0603: module 'hbbs_http' is private`. Tightly coupled to the
|
||||
**Signed agent API** divergence below.
|
||||
**Signed agent API** and **Remote PowerShell exec** divergences
|
||||
below.
|
||||
2. **Build shape** — [`vendor/rustdesk/Cargo.toml`](vendor/rustdesk/Cargo.toml):
|
||||
`[lib] crate-type` reduced from `["cdylib", "staticlib", "rlib"]` to
|
||||
`["rlib"]`. We statically link the rlib into hello-agent.exe; the
|
||||
@@ -197,6 +207,33 @@ inventory — keep it in sync when adding new patches.
|
||||
Matching server side: see rustdesk-server's
|
||||
[`docs/AGENT-API-AUTH.md`](https://github.com/cstudio-ch/rustdesk-server/blob/pro-features/docs/AGENT-API-AUTH.md)
|
||||
for the wire format and verification flow.
|
||||
7. **Remote PowerShell exec** — the dashboard can queue a PowerShell
|
||||
script for a managed peer; the agent runs it as its service account
|
||||
and POSTs the result back. Gated server-side on admin role +
|
||||
`peer.managed=1` + strategy `enable-remote-exec=Y`. Vendor-tree
|
||||
patches:
|
||||
* [`src/hbbs_http/sync.rs`](vendor/rustdesk/src/hbbs_http/sync.rs) —
|
||||
new `EXEC_SENDER` broadcast channel, new `ExecRequest` type, new
|
||||
`pub fn exec_signal_receiver()` helper, and the heartbeat-reply
|
||||
parser drains the `exec: [...]` field into the channel. Vanilla
|
||||
rustdesk simply has no subscriber — the channel send errors out
|
||||
with NoReceivers and the requests are dropped silently.
|
||||
|
||||
In the hello-agent crate:
|
||||
* [`src/exec.rs`](src/exec.rs) — the PowerShell runner. Subscribes
|
||||
to the broadcast channel above, spawns
|
||||
`powershell.exe -NoProfile -NonInteractive -ExecutionPolicy
|
||||
Bypass -Command -`, writes the script to stdin, captures
|
||||
stdout+stderr with 1 MiB cap and a 5-minute wall-clock timeout,
|
||||
signs and POSTs the result to `/api/agent/exec-result`. Started
|
||||
from `run_server()` in [`src/main.rs`](src/main.rs) (must live in
|
||||
the `--server` process to share the broadcast channel with
|
||||
sync.rs).
|
||||
* [`Cargo.toml`](Cargo.toml) — adds `process` to tokio's feature
|
||||
list for `tokio::process::Command`.
|
||||
|
||||
Server-side spec: see [`docs/AGENT-API-AUTH.md`](https://github.com/cstudio-ch/rustdesk-server/blob/pro-features/docs/AGENT-API-AUTH.md)
|
||||
§*Remote PowerShell exec*.
|
||||
|
||||
## Build
|
||||
|
||||
|
||||
Reference in New Issue
Block a user