# การใช้งาน

> HTML: https://remote.ivjn.us/docs/th/usage/

ขั้นตอนการใช้งานสำหรับผู้ดูแลนี้ครอบคลุมการติดตั้ง CLI และ Agent บนอุปกรณ์ การลงชื่อเข้าใช้ การเพิ่มและเชื่อมต่ออุปกรณ์ การรันคำสั่งระยะไกล และการเปิดเชลล์ ส่วน Web Console, Mobile Console, Android Agent, การจับคู่ และการอัปเดตอัตโนมัติ อธิบายไว้ในเอกสารที่ลิงก์ท้ายหน้านี้

แทนที่ที่อยู่และโทเค็นตัวอย่างด้วยของคุณเอง โทเค็นจะปรากฏเพียงครั้งเดียวเมื่อสร้างขึ้น อย่าวางไว้ในที่เก็บ

**ตัวตนแบบตั้งชื่อและสิทธิ์ของบัญชี** ตัวเลือกส่วนกลาง `--profile <name>` มีลำดับความสำคัญสูงกว่า `REMOTE_CLI_PROFILE` ตัวตนแบบตั้งชื่อจะเก็บ `config.toml` คีย์ส่วนตัวสำหรับ seal ความเชื่อถือรูท และแคชสิทธิ์ไว้ใน `<config_base>/remote-cli/profiles/<name>/` โดย `config_base` ยังคงใช้ XDG_CONFIG_HOME, HOME/.config หรือ APPDATA บน Windows ตามเดิม ชื่อต้องมีตัวอักษร ASCII ตัวเลข จุด ขีดกลาง หรือขีดล่าง 1–64 ตัว และต้องไม่ใช่ `.` หรือ `..` โปรไฟล์แบบตั้งชื่อมีลำดับความสำคัญสูงกว่า `REMOTE_CLI_CONFIG` หากไม่ระบุโปรไฟล์ เส้นทางเดิมและพฤติกรรมของ `REMOTE_CLI_CONFIG` จะไม่เปลี่ยน ต้องเข้าสู่ระบบแยกกันในแต่ละโปรไฟล์และเลือกโปรไฟล์นั้นในการเรียกใช้ครั้งถัดไป

`operator set` รับ ID บัญชีหรือชื่อที่ไม่ซ้ำ ส่วนอาร์กิวเมนต์อุปกรณ์ใช้ ID อุปกรณ์ `--restricted` จำกัดการมองเห็นเฉพาะอุปกรณ์ที่ได้รับสิทธิ์อย่างชัดเจน ส่วน `--unrestricted` คืนการมองเห็นตามบทบาท เฉพาะ superadmin เท่านั้นที่เปลี่ยนขอบเขตได้ Superadmin ควบคุมบทบาทและสิทธิ์ หากไม่มี superadmin ผู้ดูแลระบบจัดการได้ภายในขอบเขตที่ได้รับอนุญาต โดยยกเว้นบัญชีตนเอง `operator grant list` ส่งคืนเฉพาะสิทธิ์ที่ผู้เรียกมองเห็น สิทธิ์อุปกรณ์ในฐานข้อมูลและสิทธิ์ seal ที่ลงนามเป็นการตรวจสอบคนละส่วน การเปลี่ยนสิทธิ์อุปกรณ์ไม่แทนที่ `seal approve` การสร้างบัญชีไม่รองรับการกำหนดขอบเขตแบบอะตอมมิก ให้เก็บโทเค็นที่แสดงครั้งเดียวจาก `operator add` แล้วเรียก `operator set` / `operator grant set` แยกกัน

คำสั่ง operator ทุกคำสั่งรองรับ `-o text|json|xml` คำขอ JSON ใช้ `op=list|add|set|grant_list|grant_set|grant_remove` โดย `set` รับ `operator` และ `role` / `restricted` อย่างน้อยหนึ่งค่า ส่วน `grant_set` รับ `operator`, `device` และบูลีน `can_manage` ที่จำเป็น `grant_list` รับ `operator` แบบไม่บังคับ และ `grant_remove` รับ `operator` กับ `device` ห้ามใช้ `--json` ร่วมกับคำสั่งย่อย

```bash
remote-cli --profile alice login --server https://exchange.example.com
remote-cli --profile root operator set alice --restricted
remote-cli --profile root operator set alice --role readonly
remote-cli --profile root operator grant list --operator alice -o json
remote-cli --profile root operator grant set alice lab --view
remote-cli --profile root operator grant set alice lab --manage
remote-cli --profile root operator grant remove alice lab
remote-cli --profile root operator set alice --unrestricted
remote-cli --profile root operator --json '{"op":"grant_set","operator":"alice","device":"lab","can_manage":false}' -o json
```

## คำขอ XML และเอาต์พุต

ตรวจสอบ `remote-cli --help` เพื่อดูแฟล็กที่เวอร์ชันที่ติดตั้งรองรับ `--xml` และ `--xml-file` เพิ่มอินพุต XML ให้กับจุดเข้าคำขอ `--json` / `--json-file` ที่มีอยู่ อินพุตทั้งสี่อินพุตแยกจากกันและจัดหาเนื้อหาทั้งหมด: อย่าผสมกับตัวเลือกคำสั่งหรือคำสั่งย่อยเดียวกัน กฎตำแหน่งของอุปกรณ์ไม่เปลี่ยนแปลง เลือกอินพุตและเอาต์พุตอย่างอิสระ `-o text|json|xml` มีค่าเริ่มต้นเป็นข้อความ

```powershell
remote-cli device --xml '<request><op>list</op></request>' -o xml
remote-cli exec my-device --xml-file request.xml -o xml
```

โหนดปลายทางมีชนิดข้อมูลเริ่มต้นเป็นสตริง ส่วนองค์ประกอบที่มีโหนดลูกมีชนิดข้อมูลเริ่มต้นเป็นออบเจ็กต์ ใช้ `type="number"`, `type="boolean"`, `type="array"` และ `type="null"` สำหรับตัวเลข บูลีน อาร์เรย์ และค่า null อาร์เรย์ต้องมีโหนดลูก `<item>` ส่วนออบเจ็กต์ว่างต้องระบุ `type="object"` ใช้ `<field name="arbitrary key">value</field>` สำหรับคีย์ที่ตั้งชื่อได้อิสระ และใช้ `<request type="object"/>` สำหรับคำขอว่าง

```xml
<request>
  <command>echo hello</command>
  <timeout_secs type="number">30</timeout_secs>
  <hold type="boolean">false</hold>
  <env><GREETING>hello &amp; welcome</GREETING></env>
</request>
```

รูทเอาต์พุตคือ `<response type="...">` โดยมีสมาชิกอ็อบเจ็กต์ `<field name="..." type="...">` และสมาชิกอาร์เรย์ `<item type="...">` ประเภทมีความชัดเจนและข้อความถูกหลีกสำหรับ XML 1.0 ข้อผิดพลาดรันไทม์ส่งคืน `ok=false` / `error` ด้วยโค้ดออกที่ไม่ใช่ศูนย์ ข้อผิดพลาดทางไวยากรณ์บรรทัดคำสั่งยังคงเป็นไปที่ `stderr`

เอาต์พุต XML รองรับ `device list/update`, `operator list/add/set/grant`, `exec`, `session list/kill`, `ui`, `ubus`, `sensors`, `net`, `metrics`, `preset`, `audit`, `browser` รวมถึงการดำเนินการของงาน exec คำสั่งอื่นปฏิเสธ `-o xml` อย่างชัดเจน พวกเขายังคงสามารถใช้คำขอ XML กับรูปแบบเอาต์พุตที่มีอยู่ได้

การสตรีม `exec` / `sensors --live` / `browser session` จะปล่อยเอกสาร XML ที่สมบูรณ์หนึ่งฉบับต่อบรรทัด แยกแต่ละบรรทัดแยกกัน เหตุการณ์ข้อมูล Exec ประกอบด้วย `stream` / `encoding=base64` / `data`; Base64 จะรักษาไบต์ดั้งเดิมไว้ และ exec ธรรมดาจะลงท้ายด้วยบันทึกสถานะการออก อินพุตแบบโต้ตอบไปยัง `browser session` ยังคงเป็น JSON Lines `ui xml` ที่ไม่มี `-o xml` จะคง XML ลำดับชั้น UI แบบดิบไว้

คำขอถูกจำกัดไว้ที่ 1 MiB และ 64 ระดับที่ซ้อนกัน ช่องที่ซ้ำกัน ข้อความผสมและรายการย่อย DTD และเอนทิตีภายนอกจะถูกปฏิเสธ XML 1.0 ไม่สามารถแสดงอักขระควบคุมทุกตัวได้ เลือก JSON เมื่อต้องเก็บข้อความดังกล่าวไว้ การกำหนดค่า Agent และโปรโตคอลสายยังคงเป็น JSON XML แปลงเฉพาะอินพุตและเอาต์พุต CLI

## รับ remote-cli และ remote-agent

สร้างจากรูทของที่เก็บ:

```bash
cargo build --release
```

CLI คือ `target/release/remote-cli` คำสั่งเดียวกันนี้จะสร้าง `target/release/remote-agent` ด้วย สำหรับอุปกรณ์ที่มีแฟลชจำกัด ให้ใช้ Agent ที่ปรับขนาดแล้ว:

```bash
cargo build -p agent --no-default-features --profile release-small
```

เอาต์พุตคือ `target/release-small/remote-agent`

Windows, Linux และ macOS ยังสามารถติดตั้งไบนารีทั้งสองได้โดยใช้สคริปต์การติดตั้งเว็บไซต์ ดู [การปรับใช้อุปกรณ์หลายแพลตฟอร์ม](/docs/th/platform-installation.md#การตดตงคำสงเดยว-windowslinuxmacosfreebsdnetbsd) คำสั่งด้านล่างนี้ถือว่า `remote-cli` และ `remote-agent` อยู่ใน `PATH` หากคุณเพิ่งสร้างในเครื่อง ให้ใช้เส้นทาง `target/...` ด้านบน

สำหรับรีเลย์ที่โฮสต์เอง ให้ทำตาม [Development](/docs/th/development.md) เพื่อเริ่ม `exchange` ด้วย `DATABASE_URL` จากนั้นรับโทเค็นผู้ดูแลระบบจากบันทึกการเริ่มต้นระบบ สำหรับอินสแตนซ์สาธารณะ ให้ขอโทเค็นตัวดำเนินการจากผู้ดูแลระบบ

## เข้าสู่ระบบ

```bash
remote-cli login --server http://127.0.0.1:8080 --token '<运维令牌>'
```

ใช้ `http://` หรือ `https://` สำหรับ `--server` CLI ได้รับที่อยู่ WebSocket ที่มีระดับความปลอดภัยเดียวกัน: `https` แมปกับ `wss` และ `http` กับ `ws`

หลังจากเข้าสู่ระบบสำเร็จ การกำหนดค่าจะถูกเขียนไปที่:

- Linux / macOS: `$XDG_CONFIG_HOME/remote-cli/config.toml` หรือ `~/.config/remote-cli/config.toml` เมื่อ `XDG_CONFIG_HOME` ไม่ได้ตั้งค่า
- Windows: `%APPDATA%\remote-cli\config.toml`.

ไฟล์นี้มีเพียงสองคีย์: `server` และ `token` ตั้งค่า `REMOTE_CLI_CONFIG` เพื่อใช้พาธอื่น คำสั่ง `device`, `exec` และ `shell` ตามมาจะอ่านคอนฟิกูเรชันนี้ ดังนั้นคุณไม่จำเป็นต้องระบุโทเค็นในแต่ละครั้ง

## เพิ่มอุปกรณ์

```bash
remote-cli device add lab-router --name "实验室路由"
```

`<id>` คือ ID อุปกรณ์: ตัวอักษร ตัวเลข `-`, `_` และ `.` เท่านั้น สูงสุด 64 อักขระ `--name` เป็นทางเลือก; ชื่อที่แสดงมีค่าเริ่มต้นเป็น ID โทเค็นอุปกรณ์ในเอาต์พุตจะแสดงเพียงครั้งเดียว

## สตาร์ท Agent

บนเครื่องที่จะจัดการ ให้สตาร์ทอุปกรณ์ Agent ด้วยเซิร์ฟเวอร์ รหัสอุปกรณ์ และโทเค็นอุปกรณ์ที่สร้างขึ้นใหม่:

```bash
remote-agent --server wss://127.0.0.1:8080 --device-id lab-router --token '<设备令牌>'
```

อาร์กิวเมนต์ทั้งสามนี้ยังสนับสนุนตัวแปรสภาพแวดล้อม: `REMOTE_SERVER`, `REMOTE_DEVICE_ID` และ `REMOTE_TOKEN`

`--server` ต้องขึ้นต้นด้วย `ws://` หรือ `wss://` เมื่อระบุเฉพาะโฮสต์ (เช่น `wss://mgmt.example.com`) Agent จะต่อท้าย `/ws/device` เส้นทางที่ชัดเจนถูกใช้ไม่เปลี่ยนแปลง สำหรับ exchange แบบโลคัลที่ไม่มี TLS ให้ใช้ `ws://127.0.0.1:8080`

หากต้องการป้องกันไม่ให้โทเค็นอยู่ในอาร์กิวเมนต์ของกระบวนการ ให้สร้าง JSON ด้วยคีย์ `server`, `device_id` และ `token`:

```json
{
  "server": "wss://mgmt.example.com",
  "device_id": "lab-router",
  "token": "<设备令牌>"
}
```

จากนั้นรัน `remote-agent --config /path/to/config.json` สำหรับการติดตั้งเดสก์ท็อปและการสตาร์ทอัตโนมัติ โปรดดูที่ [การปรับใช้อุปกรณ์หลายแพลตฟอร์ม](/docs/th/platform-installation.md)

ทั้ง `remote-cli` และ `remote-agent` WebSockets อ่านการตั้งค่าพร็อกซีตามลำดับ `HTTPS_PROXY` / `https_proxy` → `ALL_PROXY` / `all_proxy` → `HTTP_PROXY` / `http_proxy` และให้เกียรติ `NO_PROXY` / `no_proxy`. Agent ใช้เส้นทางการเชื่อมต่อเดียวกันในโหมด headless และ `--ui` พรอกซีต้องรองรับ HTTP CONNECT (ไม่รองรับ SOCKS) WSS โฆษณาเฉพาะ `http/1.1` ผ่าน ALPN ตั้งค่าตัวแปรในสภาพแวดล้อมการบริการสำหรับบริการพื้นหลัง ดู [Outbound proxy และการเชื่อมต่อ keepalive](/docs/th/platform-installation.md#พรอกซขาออกและการเชอมตอยงคงอย)

เมื่ออุปกรณ์เชื่อมต่อแล้ว:

```bash
remote-cli device list
```

รายการแสดงสถานะออนไลน์

## รันคำสั่งระยะไกล

ทุกอย่างหลังจาก `--` ถูกส่งไปยังอุปกรณ์ โดยไม่ต้องแยกวิเคราะห์เพิ่มเติมโดย CLI ในเครื่อง:

```bash
remote-cli exec lab-router -- uname -a
```

จำนวนอาร์กิวเมนต์หลังจาก `--` จะกำหนดวิธีที่ฝ่ายรีโมตตีความ:

- **อาร์กิวเมนต์หลายรายการ** ถูกส่งผ่านเป็น argv โดยรักษาขอบเขตอาร์กิวเมนต์แต่ละรายการ เสมือนว่าป้อนบนอุปกรณ์โดยตรง CLI เพิ่มการเสนอราคาตามที่จำเป็น (กฎ PowerShell สำหรับอุปกรณ์ Windows)
- **หนึ่งอาร์กิวเมนต์** ส่งผ่านสตริงทั้งหมดไปยังเชลล์อุปกรณ์เป็นบรรทัดคำสั่ง ซึ่งสนับสนุนไปป์ `;` ไวด์การ์ด และตัวแปร

```bash
remote-cli exec lab-router -- sh -c 'uname -a; cat /proc/uptime'   # 多个参数，第三个参数完整交给 sh -c
remote-cli exec lab-router -- 'dmesg | tail -20'                    # 一个参数，管道在设备上执行
```

เนื่องจากมีอาร์กิวเมนต์หลายตัว `*` และ `$VAR` ตามตัวอักษรที่ส่งผ่านโดยเชลล์ในเครื่อง (ทั่วไปใน PowerShell) ยังคงเป็นตัวอักษรและไม่ได้ขยายจากระยะไกล หากต้องการขยายบนอุปกรณ์ ให้ใช้อาร์กิวเมนต์เดียว เช่น `-- 'ls /etc/*.conf'`

exec เปิดใช้งานการระงับตามค่าเริ่มต้น: การหมดเวลาเริ่มต้นคือ 3600 วินาที (ขีดจำกัดฮาร์ด 86400 วินาที) และผู้ดำเนินการตัดการเชื่อมต่อจะแยกเอาต์พุตออกโดยไม่ฆ่างาน ตั้งค่าขีดจำกัดเวลาด้วย `--timeout` เช่น `remote-cli exec lab-router --timeout 120 -- uname -a` `--hold-timeout` แทนที่ขีดจำกัดการระงับ เพิ่ม `--no-hold` เพื่อยกเลิกการยกเลิกการเชื่อมต่อของผู้ปฏิบัติงาน โดยมีการหมดเวลาเริ่มต้นที่ 60 วินาที เมื่อคำสั่งกลับมาตามปกติ รหัสทางออกจะกลายเป็นรหัสทางออกของ `remote-cli`

### ตรวจสอบและหยุดงาน และปล่อยสล็อตเซสชัน

```bash
remote-cli exec-holds lab-router
remote-cli exec-hold-kill lab-router <job_id>
remote-cli exec-hold-tail lab-router <job_id>
remote-cli exec-hold-cat lab-router <job_id>
remote-cli exec-attach lab-router <job_id>
remote-cli sessions lab-router
remote-cli session-kill lab-router <session_id>
```

`exec-holds` แสดงรายการงาน exec และการดาวน์โหลดที่แอ็คทีฟ การอัพโหลด และการสืบค้นไดเร็กทอรี โดยแสดง `job_id`, `kind`, `status`, `age_secs`, `session_id` ฝั่งอุปกรณ์ปัจจุบัน (ถ้ามี) และสรุปคำสั่ง/พาธที่ถูกตัดทอน `exec-hold-kill` สิ้นสุดกลุ่มกระบวนการหรือยกเลิกการถ่ายโอนไฟล์ตาม ID งาน tail, cat และไฟล์แนบใช้กับงาน exec เท่านั้น

`sessions` อ่านตารางเส้นทาง Exchange โดยตรง โดยแสดง `count/limit` ปัจจุบันและ ID เซสชันฝั่งอุปกรณ์ `session-kill` ใช้ **device-side** ID นี้เพื่อส่งการยกเลิกไปยังอุปกรณ์และปล่อยสล็อต Exchange ทันที แม้ว่าไม่มีการตอบกลับจากอุปกรณ์ก็ตาม การดำเนินการทั้งสองอย่างจะไม่เปิดเซสชันอุปกรณ์เพิ่มเติมหรือใช้ช่องการทำงานพร้อมกัน ทำให้มีประโยชน์สำหรับเซสชันที่ค้างอยู่ที่ความจุ บัญชีแบบอ่านอย่างเดียวไม่สามารถใช้งานได้

การหมดเวลาของผู้บริหารจะยุติกลุ่มกระบวนการทั้งหมด การระบายเอาต์พุตและการส่งข้อความเสร็จสิ้นต่างก็มีกำหนดเวลา ที่ขีดจำกัดการทำงานพร้อมกัน Exchange จะเรียกคืนเส้นทางที่สูญเสียผู้ให้บริการหรือเกินกำหนดเวลาก่อน จากนั้นจึงลองใช้เซสชันใหม่ กำหนดเวลาของ Exec คือขีดจำกัดการดำเนินการจริงบวกด้วยเวลาผ่อนผัน 15 วินาที การถ่ายโอนไฟล์อนุญาต 3600 วินาทีบวก 15 วินาที (อุปกรณ์ยังมีระยะหมดเวลาไม่ได้ใช้งาน 30 วินาที) ส่วนเซสชันอื่นๆ อนุญาต 24 ชั่วโมง ก่อนถึงกำหนดเส้นตาย Hold exec จะไม่ถูกฆ่าเพียงเพราะตัวดำเนินการตัดการเชื่อมต่อ ตัดการเชื่อมต่อยังคงแยกออกเท่านั้น `session-kill` ที่ชัดเจนหรือเกินกำหนดเวลาจะยกเลิกกระบวนการที่ระงับไว้

## เปิดเปลือก

```bash
remote-cli shell lab-router
```

นี่เป็นเซสชัน PTY บนอุปกรณ์ ไม่ใช่ SSH การออกจากเชลล์จะสิ้นสุดเซสชัน

## จุดเข้าอื่นๆ

- คอนโซลเบราว์เซอร์: [เว็บคอนโซล](/docs/th/web-console-and-notifications.md)
- คอนโซลมือถือ: [ไคลเอนต์มือถือ](/docs/th/platform-installation.md)
- อุปกรณ์ Android APK: [Standalone Android APK](/docs/th/platform-installation.md#android-apk-แบบสแตนดอโลน)
- รหัส QR รหัสหกหลัก และบัญชี: [การเริ่มต้นและการจับคู่](/docs/th/pairing-and-enrollment.md)
- การอัปเดตตนเองของ CLI และ Agent: [การอัปเดตตนเอง](/docs/th/self-update.md)

## การเข้ารหัสจากต้นทางถึงปลายทาง (เซสชันที่ปิดผนึก)

`remote-cli exec <设备> -- <命令>` และ `remote-cli shell <设备>` ใช้เซสชันที่ปิดผนึกจากต้นทางถึงปลายทางตามค่าเริ่มต้น โดยไม่มีแฟล็กเพิ่มเติม Exchange ส่งต่อเฉพาะข้อความไซเฟอร์เท็กซ์ และไม่สามารถมองเห็นคำสั่ง เอาต์พุต หรือเนื้อหาเทอร์มินัลได้ อุปกรณ์เชื่อถือเฉพาะรูทของพื้นที่ทำงาน (คีย์ของผู้ดูแลระบบระดับสูง ซึ่งสร้างขึ้นโดยอัตโนมัติเมื่อผู้ดูแลระบบระดับสูงเข้าสู่ระบบ) และให้สิทธิ์ที่ลงนามโดยรูทนั้น ลูกค้ารูทจะออกเงินช่วยเหลือให้กับสมาชิกโดยอัตโนมัติตามบทบาทบัญชีของพวกเขา ดูการตั้งค่าครั้งเดียวในเซสชันที่ปิดผนึก [End-to-end](/docs/th/sealed-sessions.md)

เซสชันอุปกรณ์ CLI ทั้งหมดใช้เฉพาะการปิดผนึกจากต้นทางถึงปลายทางเท่านั้น โดยไม่มีแฟล็กเพิ่มเติม ข้อมูลความสามารถของอุปกรณ์ที่ขาดหายไปหรือการจับมือที่ปิดผนึกที่ล้มเหลวจะไม่ทำให้เกิดการสลับไปเป็นข้อความธรรมดา การเชื่อมต่อ LAN โดยตรงและการทำงานของเบราว์เซอร์บังคับใช้ข้อกำหนดการปิดผนึกเดียวกัน

## งานพื้นหลังที่คงทน

ตัวแทนโฆษณา `tasks` ดำเนินการเดียวหรือ DAG ที่ประกาศบนอุปกรณ์ งานที่ส่งจะดำเนินต่อไปหลังจาก Console ยกเลิกการเชื่อมต่อ เชื่อมต่ออีกครั้งเพื่ออ่านความคืบหน้า เอาต์พุต และอาร์ติแฟกต์ในเครื่อง รันไทม์รีสตาร์ททำเครื่องหมายงานที่ยังไม่เสร็จ `interrupted`; มันไม่เคยเล่นซ้ำโดยอัตโนมัติ

การสร้างต้องมีการอนุญาต `manage/owner` ที่ปิดผนึก เลือกการขึ้นต่อกัน เงื่อนไขคงที่ การอ้างอิง JSON Pointer ระดับบนสุด นโยบายความล้มเหลว และการลองใหม่อย่างชัดเจนสูงสุดห้าครั้ง การลองใหม่อาจทำให้เกิดผลข้างเคียงซ้ำได้ การยกเลิกจะไม่ย้อนกลับ คอนโซลบนเว็บและอุปกรณ์พกพามีแบบฟอร์มและการนำเข้า/ส่งออก JSON เดสก์ท็อป, Android, เบราว์เซอร์ และอินเทอร์เฟซภายใน LuCI ให้ประวัติ เอาต์พุต การยกเลิก และการลบ

เริ่มต้นด้วยแค็ตตาล็อกการดำเนินงาน: การสนับสนุนและข้อยกเว้นแตกต่างกันไปตามแพลตฟอร์ม ไฟล์สเตจก่อนการสร้าง ขีดจำกัดเริ่มต้นคือ 30 วัน, 1,000 งาน, รวม 64 MiB, ข้อความ 8 MiB ต่องาน, สี่ขั้นตอนคู่ขนาน (สองขั้นตอนใน OpenWrt) และการหมดเวลาขั้นตอน 30 นาทีที่กำหนดค่าได้สูงสุด 24 ชั่วโมง Old Agents ไม่แสดงรายการงาน
```sh
remote-cli task DEVICE operations
remote-cli task DEVICE create pipeline.json --wait
remote-cli task DEVICE list
remote-cli task DEVICE get TASK_ID
remote-cli task DEVICE logs TASK_ID --offset 0
remote-cli task DEVICE cancel TASK_ID
remote-cli task DEVICE upload ./input.bin
remote-cli task DEVICE download TASK_ID STEP.artifact ./result.json
remote-cli task DEVICE delete TASK_ID
```

## บริการที่มีการกำกับดูแล

โหมด Service ของ Task ดูแลคำสั่งแบบ foreground ของระบบ โดยบันทึกสถานะที่ต้องการ รองรับนโยบายเริ่มใหม่ การหน่วงแบบทวีคูณ จำกัดความถี่การเริ่ม และกู้คืนหลัง Agent เริ่มใหม่ ค่าเริ่มต้นคือหยุด ต้องหยุดและรอให้จบก่อนแก้ไขหรือลบ เมื่อสิทธิ์หมดอายุหรือถูกเพิกถอน บริการจะหยุด DAG ปกติจะไม่เล่นซ้ำ จัดการผ่าน Web มือถือ เดสก์ท็อป และ Android ได้ ส่วน LuCI ตั้งค่าผ่าน Console หรือ CLI Browser Agent ไม่รองรับการดูแลโปรเซสของระบบ

ใช้ command.command หรือ command.argv พร้อม cwd/env, restart (never/on_failure/always), start_secs, stop_grace_secs, backoff_secs, max_backoff_secs, restart_window_secs และ max_starts บน Windows การหยุดอย่างเรียบร้อยต้องใช้ stop_command ส่วน Unix ใช้ SIGTERM และบังคับหยุดทั้งต้นไม้โปรเซสเมื่อหมดเวลาผ่อนผัน ต้องตั้งค่าให้ Agent เริ่มเมื่อเปิดเครื่องแยกต่างหาก service get คืนค่า run_id สำหรับ task get/logs

```sh
remote-cli task DEVICE service put worker.json
remote-cli task DEVICE service list
remote-cli task DEVICE service start worker
remote-cli task DEVICE service get worker
remote-cli task DEVICE service restart worker
remote-cli task DEVICE service stop worker
remote-cli task DEVICE service delete worker
remote-agent task service put worker.json
```
