# การถ่ายโอนไฟล์และการเชื่อมต่อ LAN โดยตรง

> HTML: https://remote.ivjn.us/docs/th/files-and-lan/

Agent, Exchange, CLI, เว็บคอนโซล และคอนโซลมือถือรองรับการถ่ายโอนไฟล์ อุปกรณ์ที่รองรับโฆษณาความสามารถของ `files`

## การถ่ายโอนไฟล์

```sh
remote-cli file i5m ls /tmp
remote-cli file i5m upload ./example.zip /tmp/example.zip
remote-cli file i5m download /tmp/example.zip ./downloaded.zip
remote-cli file i5m fetch https://example.com/example.zip ./example.zip
```

ไฟล์ที่มีอยู่จะไม่ถูกเขียนทับตามค่าเริ่มต้น เพิ่ม `--overwrite` เมื่ออัปโหลดหรือดาวน์โหลดเพื่อให้สามารถเปลี่ยนได้ ยกเลิกด้วย Ctrl+C ใน CLI หรือปุ่มยกเลิกในเว็บ/คอนโซลมือถือ ใช้แท็บรายละเอียดอุปกรณ์ **Files** บนเว็บ หรือ **การถ่ายโอนไฟล์** จากรายละเอียดอุปกรณ์บนมือถือ

การถ่ายโอนใช้ชิ้น 64 KiB รอการตอบรับหลังจากแต่ละชิ้น ไฟล์เดียวถูกจำกัดไว้ที่ 1 GiB; การดาวน์โหลดเบราว์เซอร์จำกัดอยู่ที่ 128 MiB ดังนั้นให้ใช้ CLI หรือคอนโซลมือถือสำหรับไฟล์ขนาดใหญ่ รายชื่อไดเร็กทอรีส่งคืนได้สูงสุด 1,000 รายการ ไม่รองรับการอัปโหลดไดเรกทอรีแบบเรียกซ้ำ การอัปโหลดจะเขียนไฟล์ชั่วคราวในไดเร็กทอรีปลายทางและแทนที่ปลายทางแบบอะตอมมิกหลังจากได้รับไฟล์เต็ม การยกเลิก การตัดการเชื่อมต่อ และการหมดเวลาจะล้างไฟล์ชั่วคราวที่ไม่สมบูรณ์ การดาวน์โหลด CLI ยังใช้ไฟล์ชั่วคราวด้วย การดาวน์โหลดบนมือถือไปที่แคช จากนั้นเรียกใช้การแชร์/การบันทึกระบบ

การเข้าถึงไฟล์ใช้สิทธิ์ระบบปฏิบัติการของกระบวนการ Agent และไม่จำกัดเฉพาะไดเร็กทอรีที่แชร์ บัญชีแบบอ่านอย่างเดียวไม่สามารถแสดงรายการไดเร็กทอรี อัพโหลด หรือดาวน์โหลดได้ Exchange จะคงการตรวจสอบความเป็นเจ้าของพื้นที่ทำงาน การแยกเซสชัน และการตรวจสอบการดำเนินการโดยไม่ต้องบันทึกเนื้อหาไฟล์ บน Android นั้น `.` จะชี้ไปที่ไดเร็กทอรีไฟล์ของแอป Agent ไดเร็กทอรีอื่น ๆ ยังคงอยู่ภายใต้การอนุญาต Android และแซนด์บ็อกซ์ของระบบ

## ดาวน์โหลดทางอินเตอร์เน็ตผ่าน Agent

ป้อน HTTP/HTTPS URL ในแท็บไฟล์ของเว็บ หรือเรียกใช้ `file DEVICE fetch URL LOCAL` Agent ดาวน์โหลดจากเครือข่ายของตัวเองและสตรีมไฟล์ไปยังคอมพิวเตอร์ Console โดยไม่บันทึกลงใน Agent การดาวน์โหลดทางเว็บจำกัดไว้ที่ 128 MiB; CLI ดาวน์โหลดเป็น 1 GiB การยกเลิก การยกเลิกการเชื่อมต่อ และความล้มเหลวจะละทิ้งไฟล์ที่ไม่สมบูรณ์ ปลายทาง CLI ที่มีอยู่ต้องใช้ `--overwrite` Native Agent (เดสก์ท็อป, Linux, Android และ OpenWrt) รองรับสิ่งนี้ ส่วนขยายเบราว์เซอร์ไม่มีการถ่ายโอนไฟล์ การตรวจสอบใบรับรองยังคงเปิดใช้งานอยู่ URL ที่มีข้อมูลประจำตัวฝังอยู่และดาวน์เกรด HTTPS จะถูกปฏิเสธ โดยมีการเปลี่ยนเส้นทางสูงสุดห้าครั้ง

การดาวน์โหลดไม่สืบทอดเซิร์ฟเวอร์การจัดการ `--insecure`

## คำขอ HTTP แบบ Curl

วางคำสั่ง curl ในแท็บคำขอ HTTP ของอุปกรณ์ Console ส่งคำขอที่ปิดผนึกไปยัง Agent ที่เลือก และแสดงสถานะ เวลาที่ผ่านไป ส่วนหัวและเนื้อหา แยกวิเคราะห์ `-X/--request`, `-H/--header`, `-d/--data`, `--data-raw`, อินไลน์ `--data-binary`, `--json`, `-I/--head`, `-L/--location`, `-m/--max-time` และ `--url` เป็นข้อมูล มันไม่เคยดำเนินการนิพจน์เชลล์หรืออ่าน `@file` Native Agent ใช้เครื่องมือ HTTP ที่ใช้ร่วมกันโดยไม่ต้องมีขด ส่วนขยายเบราว์เซอร์ต้องการสิทธิ์การเข้าถึงไซต์ ละเว้นคุกกี้ของเบราว์เซอร์ ปฏิเสธส่วนหัวที่ต้องห้าม และรายงานการเปลี่ยนเส้นทางที่ซ่อนโดย Chromium ใช้ URL สุดท้าย สิทธิ์แบบอ่านอย่างเดียวไม่สามารถส่งคำขอได้ เนื้อความของคำขอถูกจำกัดไว้ที่ 256 KiB และหมดเวลาอยู่ที่ 120 วินาที การตอบกลับถูกตัดทอนที่ 1 MiB สำหรับตัวแทนดั้งเดิมหรือ 128 KiB ในส่วนขยาย ใช้การดึงไฟล์สำหรับการดาวน์โหลดแบบไบนารีหรือขนาดใหญ่กว่า

ข้อความที่ปิดผนึกคือ `net_req` ความสามารถของเบราว์เซอร์: `net` เทียบเท่า CLI: `remote-cli net DEVICE http URL -X POST -H 'Content-Type: application/json' -d '{"message":"hello"}'`

```sh
curl -X POST 'https://example.com/api' -H 'Content-Type: application/json' --data-raw '{"message":"hello"}'
```

## พอร์ตควบคุมแลน

การควบคุม LAN ถูกปิดใช้งานตามค่าเริ่มต้น โดยมีพอร์ต TCP เริ่มต้น **7277** เปิดใช้งานบน LAN ที่เชื่อถือได้เท่านั้น ก่อนเปิดใช้งาน อุปกรณ์จะต้องปักหมุดรูทพื้นที่ทำงาน (`remote-agent seal root` หรือเชื่อมต่อกับ Exchange ก่อนเพื่อทำให้ TOFU สมบูรณ์) ไม่มีโทเค็นการเข้าถึง LAN อย่าส่งต่อพอร์ตไปยังอินเทอร์เน็ตสาธารณะ

เพิ่มฟิลด์เหล่านี้ในการกำหนดค่า Agent JSON ที่มีอยู่:

```json
{
  "lan_enabled": true,
  "lan_port": 7277
}
```

เก็บฟิลด์ `server`, `device_id` และ `token` ที่มีอยู่ หรือใช้ `--lan-enabled`, `--lan-port` หรือ `REMOTE_LAN_ENABLED`, `REMOTE_LAN_PORT` การเปิดใช้งาน LAN โดยไม่มีรูทพื้นที่ทำงานที่ปักหมุดจะทำให้การเริ่มต้นระบบล้มเหลว

ทั้งการกำหนดค่าเดสก์ท็อปและการตั้งค่า LuCI มีสวิตช์ รีสตาร์ท Agent หลังจากเปลี่ยน; การกำหนดค่าเดสก์ท็อปจำเป็นต้องหยุดการเชื่อมต่อก่อนทำการแก้ไข การปิดสวิตช์และการรีสตาร์ทจะหยุดการฟังบนพอร์ตนี้ โปรแกรมจะไม่เพิ่มกฎไฟร์วอลล์โดยอัตโนมัติ

สำหรับการเชื่อมต่อโดยตรงของ CLI ให้เขียนการกำหนดค่าแยกต่างหากแทนที่จะใช้ `login` (ซึ่งต้องใช้โทเค็นที่ไม่ว่างเปล่า) ตั้งค่า `server` เป็น `http://IP:7277` ของอุปกรณ์ และปล่อย `token` ว่างไว้ คำร้องขอไม่มีส่วนหัว `Authorization`:

```toml
server = "http://192.168.1.20:7277"
token = ""
```

ชี้ `REMOTE_CLI_CONFIG` ไปที่ไฟล์นี้เพื่อคงการเข้าสู่ระบบคลาวด์แยกต่างหาก ข้อมูลระบุตัวตนที่ปิดผนึกและแคชการให้สิทธิ์จะอยู่ข้างๆ การกำหนดค่านี้: การให้สิทธิ์แบบออฟไลน์ใน `seal-grants.json` และห่วงโซ่ใบรับรองระดับรูทแรกใน `seal-chains.json` การทำงานของอุปกรณ์ทั้งหมดเปิดเฉพาะเซสชันที่ปิดผนึก รวมถึงการเชื่อมต่อโดยตรงที่มีการ์ดอุปกรณ์มี `local` หรือจุดสิ้นสุด LAN `/api/auth/me` ส่งคืน 401 Agent จะไม่ออกหรือต่ออายุสิทธิ์เหล่านี้ ในขณะที่คลาวด์ออฟไลน์ เฉพาะการให้สิทธิ์รูทเชนที่ยังคงใช้ได้ในแคชเท่านั้นที่สามารถใช้งานได้ `sessions` และ `session-kill` ไม่พร้อมใช้งาน: LAN ไม่มีไดเร็กทอรีเซสชัน และ Exchange ยังคงจัดการเซสชันอุปกรณ์ต่อไป

การเชื่อมต่อโดยตรงเปิดเผยเฉพาะอุปกรณ์ภายในเครื่องเท่านั้น เลเยอร์ชั้นนอกยอมรับเฉพาะที่อยู่ส่วนตัว ที่อยู่ลิงก์โลคอล หรือลูปแบ็ค และตรวจสอบความถูกต้องของ Origin หลังจากการตรวจสอบเหล่านี้ `GET /api/devices` จะส่งคืนเฉพาะ ID อุปกรณ์และ `seal_key` / `seal_mode` ที่จำเป็นในการเริ่มการจับมือแบบปิดผนึก `GET /api/auth/me` จะไม่ส่งคืนข้อมูลประจำตัวของผู้ปฏิบัติงานก่อนการจับมือแบบปิดผนึก `GET /ws/operator` ยอมรับเฉพาะเซสชันที่ปิดผนึกเท่านั้น และไม่มีพาธที่เข้ากันได้กับข้อความธรรมดา

ไคลเอนต์มีการพิสูจน์คีย์สาธารณะของตัวดำเนินการ การอนุญาตออฟไลน์ที่แคชไว้ (`hello.grant`) และห่วงโซ่ใบรับรองรูทแรก (`hello.chain`) ที่เป็นตัวเลือกแบบอินไลน์ใน `open_sealed` hello อุปกรณ์ใช้กฎเดียวกันกับพาธ Exchange เพื่อตรวจสอบรากในเครื่อง ขอบเขตอุปกรณ์ และการอนุญาตในการดู/จัดการ โดยปิดผนึกเนื้อหาเซสชันไว้ เว็บคอนโซลยังคงเชื่อมต่อผ่าน Exchange ตามค่าเริ่มต้น Listener จะผูกอินเทอร์เฟซ IPv4 ทั้งหมดและยังคงใช้งานได้ในขณะที่ระบบคลาวด์ออฟไลน์ ความล้มเหลวในการผูก LAN จะถูกบันทึกไว้ในขณะที่การเชื่อมต่อบนคลาวด์ยังคงดำเนินต่อไป

## การตรวจสอบการถดถอย

```sh
python scripts/file-transfer-smoke.py --agent target/debug/remote-agent --cli target/debug/remote-cli
python scripts/agent-ui-smoke.py --agent target/debug/remote-agent --platform linux
```

ต้องใช้ Python 3.11+ และ `websockets` บน Windows ให้ใช้พาธ `.exe` และ `--platform windows` การทดสอบใช้การกำหนดค่าและไฟล์ชั่วคราวโดยไม่ต้องเปลี่ยนข้อมูลเข้าสู่ระบบหรืออุปกรณ์ที่มีอยู่
