ข้ามไปที่เนื้อหา

System Access

วิธีให้เอเจนต์เข้าถึงเครื่องที่มันรันอยู่ และขีดจำกัดจริงอยู่ตรงไหน

Warning

shell_exec รันคำสั่งใดๆ ในฐานะผู้ใช้ของคุณ ไม่มี command allowlist ไม่มี denylist และไม่มี sandbox เว้นแต่คุณจะเปิดมันเอง เอเจนต์ที่ถือ tool นี้ทำ อะไรก็ได้ที่คุณทำได้จากเทอร์มินัล


เริ่มที่นี่: คุณอาจยังไม่ได้เปิดใช้งาน tool ใดๆ เลย

หากเอเจนต์บอกว่ามันรันคำสั่งหรืออ่านไฟล์ไม่ได้ นั่นมักไม่ใช่ปัญหาเรื่องสิทธิ์ มันหมายความว่าไม่มี tool ใดถูกเปิดใช้งานตั้งแต่แรก

Tool มาจาก tools.enabled และ fallback ไปที่ agent.tools ทั้งสองค่าเริ่ม ต้นเป็นค่าว่าง และค่าว่างจะสร้างเอเจนต์ที่มี tool เป็นศูนย์ ไม่มีอะไรเปิด ใช้งานเป็นค่าเริ่มต้นเลย

ตรวจสอบก่อนว่าคุณมีไฟล์ config อยู่หรือไม่:

cat ~/.openjarvis/config.toml

หากไม่มี นั่นคือคำตอบ สร้างมันขึ้นมา:

[engine]
default = "ollama"

[intelligence]
default_model = "qwen3.5:9b"

[agent]
default_agent = "orchestrator"

[tools]
enabled = ["shell_exec", "file_read", "file_write", "think"]

มีเวอร์ชันแบบเต็มกว่าอยู่ที่ configs/openjarvis/examples/full-system-access.toml

จากนั้นยืนยันว่ารายการถูก resolve จริง:

python -c "from openjarvis.core.config import load_config; print(load_config().tools.enabled)"

Tool เข้าถึงอะไรได้บ้าง

Tool ขอบเขต
shell_exec คำสั่งใดๆ ในฐานะผู้ใช้ของคุณ timeout เริ่มต้น 30 วินาที สูงสุด 300 วินาที output ถูกจำกัดที่ 100 KB ต่อ stream
file_read Path ที่อ่านได้ใดๆ จำกัดที่ 1 MB
file_write Path ที่เขียนได้ใดๆ จำกัดที่ 10 MB สร้างไดเรกทอรีแม่ได้
apply_patch นำ unified diff ไปใช้กับ path ใดๆ
code_interpreter Python ใน subprocess อยู่หลัง pattern blocklist แบบหยาบ

file_read และ file_write รับ argument allowed_dirs ที่จำกัดให้ใช้ได้เฉพาะ ชุดไดเรกทอรีที่กำหนด แต่ไม่มีคีย์ config ใดเติมค่านี้ให้ เมื่อว่างเปล่า ทุก path จะได้รับอนุญาต หากคุณต้องการ filesystem jail ในวันนี้ ใช้ container sandbox แทนที่จะพึ่ง tool เหล่านี้บังคับ

ชื่อไฟล์ที่ Sensitive

file_read และ file_write จะปฏิเสธชื่อที่ตรงกับ glob list สั้นๆ: .env, *.pem, id_rsa, credentials.* และอื่นๆ อีกสิบกว่ารายการ มันตรวจจาก ชื่อไฟล์เท่านั้น ไม่ใช่ path หรือเนื้อหา และมีเพียง tool สองตัวนี้เท่านั้นที่ ตรวจสอบมัน shell_exec, apply_patch และ code_interpreter ข้ามการตรวจนี้ ไปทั้งหมด ดังนั้น cat ~/.ssh/id_rsa ผ่าน shell_exec จึงยังทำงานได้ตามปกติ ให้มองว่านี่คือการป้องกันการพิมพ์ผิด ไม่ใช่ขอบเขตความปลอดภัย


พฤติกรรมการยืนยัน (Confirmation)

shell_exec, git_commit และ agent_kill ถูกทำเครื่องหมายเป็น requires_confirmation สิ่งนี้แปลว่าอะไรขึ้นอยู่กับวิธีที่คุณเปิดเอเจนต์ ทั้งหมด:

Entry Point พฤติกรรม
jarvis chat ถามยืนยันก่อนการเรียกแต่ละครั้ง
jarvis ask อนุมัติอัตโนมัติ
jarvis agent ask อนุมัติอัตโนมัติ ส่ง --no-yes หากต้องการให้ถาม
HTTP server, แอปเดสก์ท็อป อนุมัติอัตโนมัติ Tool ที่คุณเพิ่มเข้าไปใน toolkit ของเอเจนต์ถือว่าได้รับการอนุมัติล่วงหน้าแล้ว
Embed ผ่าน SystemBuilder ไม่มี callback ต่อสายไว้ ดังนั้น tool เหล่านี้จะล้มเหลวแบบ fail-closed

แถวสุดท้ายมักทำให้คนพลาด หาก shell_exec คืนข้อความ "requires confirmation but no confirmation callback is available" แปลว่าคุณกำลังสร้างเอเจนต์เอง และ ต้องส่ง confirm_callback เข้าไปด้วย

enforce_tool_confirmation ไม่มีผลอะไรเลย

config loader ยอมรับ security.enforce_tool_confirmation แต่ไม่มีจุดใดใน เส้นทางการรัน tool อ่านค่านี้เลย การตั้งค่านี้จะไม่เปลี่ยนพฤติกรรมการ ยืนยันที่ใดเลย ใช้ตารางด้านบนแทน


macOS: Full Disk Access

บน macOS ระบบปฏิบัติการคือขอบเขตจริง ไม่ใช่ config การเข้าถึง shell และไฟล์ ทั่วไปเริ่มทำงานได้ทันทีที่คุณเปิดใช้งาน tool แต่ข้อมูลที่ TCC ป้องกันไว้ ไม่เป็นเช่นนั้น: Messages, Mail, Photos, ประวัติ Safari, Contacts และ Calendar ทั้งหมดยังคงถูกล็อกไว้ และไม่มีคีย์ config ใดเปลี่ยนสิ่งนั้นได้

ให้สิทธิ์ Full Disk Access กับ process ที่ host backend Child process จะได้ รับสิทธิ์นี้สืบทอดมา:

วิธีที่คุณรัน OpenJarvis ให้สิทธิ์แก่
CLI (jarvis ask, jarvis chat) เทอร์มินัลของคุณ (Terminal, iTerm, Warp)
แอปเดสก์ท็อป OpenJarvis.app ซึ่งเรียก jarvis serve ขึ้นมาภายใน
launchd (deploy/launchd/com.openjarvis.plist) binary jarvis เป็น entry ของตัวมันเอง

System Settings จากนั้น Privacy & Security จากนั้น Full Disk Access จากนั้น +

launchd daemon มี TCC context ของตัวเอง การให้สิทธิ์กับ Terminal จึงไม่มีผล กับมัน เพิ่ม /usr/local/bin/jarvis แยกต่างหาก

หากต้องการตรวจสอบว่าการให้สิทธิ์มีผลหรือไม่:

head -c 16 ~/Library/Messages/chat.db >/dev/null 2>&1 \
  && echo "granted" || echo "denied"

Restart process ที่ host หลังจากเปลี่ยนการตั้งค่านี้

สั่งงานแอป Mac

AppleScript ทำงานผ่าน shell_exec:

osascript -e 'tell application "Music" to play'

macOS จะขอสิทธิ์ Automation ครั้งเดียวต่อแอปเป้าหมาย ในครั้งแรกที่คุณแตะมัน


สิ่งที่คุณทำไม่ได้

ไม่มี computer use OpenJarvis มองไม่เห็นหน้าจอของคุณ ขยับ pointer ไม่ได้ หรือส่งการกดแป้นพิมพ์ไม่ได้ ไม่มี tool สำหรับสิ่งนี้ที่ลงทะเบียนไว้ และไม่มี library automation อินพุตปรากฏอยู่ที่ใดในโค้ดเบสเลย ดังนั้นการให้สิทธิ์ Accessibility หรือ Screen Recording จึงไม่ได้อะไรเพิ่มขึ้นมาด้วยตัวมันเอง

action click และ type ที่คุณจะพบเป็นของ Playwright ซึ่งจำกัดอยู่แค่หน้า เบราว์เซอร์ ไม่ใช่เดสก์ท็อป

บางส่วนของสิ่งนี้เข้าถึงได้ผ่าน shell_exec หากคุณนำเครื่องมือมาเอง screencapture จะจับภาพหน้าจอได้เมื่อคุณให้สิทธิ์ Screen Recording แล้ว และ บางอย่างเช่น cliclick จะขยับ pointer ได้ สิ่งนี้ทำให้คุณมี action แบบ สคริปต์ แต่ไม่ได้ทำให้คุณมีเอเจนต์ที่มองหน้าจอและคิดเองว่าจะคลิกตรงไหน


การจำกัดการเข้าถึง

การเข้าถึงกว้างขึ้นและแคบลงผ่าน tools.enabled ถอดรายการออกเพื่อริบ ความสามารถ รายการนั้นคือสิทธิ์ทั้งหมดที่ให้ไป

มีตัวเลือกการแยก isolation ที่แข็งแกร่งกว่าอยู่สองแบบ ทั้งคู่ปิดเป็นค่าเริ่มต้น:

[sandbox]
enabled = true          # run tools inside a container
runtime = "docker"

[security.capabilities]
enabled = true          # RBAC over declared tool capabilities
policy_path = "~/.openjarvis/policy.yaml"

Capability เปิดกว้างเป็นค่าเริ่มต้น แม้เมื่อเปิดใช้งานแล้ว

CapabilityPolicy ถูกสร้างด้วย default_deny=False และไม่มีคีย์ config ใด expose flag นั้น ดังนั้นเอเจนต์ที่ไม่มี entry นโยบายชัดเจนจะได้รับทุก capability เขียน entry สำหรับทุกเอเจนต์ที่คุณตั้งใจจะจำกัด

สำหรับอะไรที่ไม่น่าเชื่อถือ ใช้ docker_shell_exec และ code_interpreter_docker แทนเวอร์ชันฝั่ง host


ดูเพิ่มเติม

  • Security สำหรับ scanner, audit log และ guardrail
  • Tools สำหรับ registry แบบเต็ม
  • Code Assistant สำหรับการตั้งค่าแบบเปิด shell ที่แคบกว่า
  • External MCP Servers สำหรับความสามารถที่ OpenJarvis ไม่ได้มีมาให้เอง