วิธีใช้ Claude Code บนโทรศัพท์ผ่าน VPS
Claude Code ทำงานบน VPS ใน tmux ไม่ใช่บนโทรศัพท์ ใช้ SSH keys, mosh และ tmux attach พร้อมวิธีแก้ปัญหาแป้นพิมพ์ที่สำคัญเมื่อใช้งานผ่านมือถือ
การใช้งาน Claude Code จากโทรศัพท์มือถือ: หลักการทำงานจริง
คู่มือนี้ใช้แอปพลิเคชันเทอร์มินัลบนโทรศัพท์มือถือของคุณ โดย Claude Code จะทำงานบน VPS (virtual private server) ภายในเซสชัน tmux ที่เปิดค้างไว้ โทรศัพท์ของคุณจะสร้างการเชื่อมต่อ SSH (secure shell) ไปยังเซสชันดังกล่าวตราบเท่าที่คุณยังเปิดใช้งานอยู่ เมื่อคุณปิดแอป ตัวเอเจนต์จะยังคงทำงานต่อไปเนื่องจากกระบวนการไม่ได้ทำงานอยู่บนโทรศัพท์ตั้งแต่แรก
นอกจากนี้ Claude Code ยังมีฟีเจอร์ Remote Control: คุณสามารถรันคำสั่ง /remote-control ภายในเซสชันเพื่อใช้งานผ่านแอป Claude บนมือถือหรือเบราว์เซอร์ ในขณะที่กระบวนการยังคงทำงานอยู่บนเซิร์ฟเวอร์
การแยกส่วนการทำงานนี้คือหัวใจสำคัญของการออกแบบ ระบบปฏิบัติการบนโทรศัพท์จะระงับการทำงานของแอปหลังจากที่คุณสลับไปใช้แอปอื่นเพียงไม่กี่วินาที ส่งผลให้งานระยะยาวที่เริ่มบนโทรศัพท์ต้องหยุดชะงัก นอกจากนี้โทรศัพท์ยังได้รับ network address ใหม่ทุกครั้งที่คุณสลับจาก Wi-Fi ไปใช้ข้อมูลมือถือ ปัญหาทั้งสองประการนี้จะหมดไปเมื่อกระบวนการทำงานบนเซิร์ฟเวอร์และโทรศัพท์ทำหน้าที่เพียงแสดงผลหน้าจอเท่านั้น
คุณจำเป็นต้องมีองค์ประกอบ 4 อย่างบนเซิร์ฟเวอร์: tmux สำหรับคงเซสชันไว้, SSH keys สำหรับการเข้าถึง, mosh สำหรับรองรับการเปลี่ยนเครือข่าย และตัว Claude Code เอง ส่วนฝั่งโทรศัพท์นั้นใช้เพียงแอปเทอร์มินัลที่มีแถวปุ่มกดที่คุณสามารถใช้งานได้สะดวกก็เพียงพอแล้ว
สิ่งที่จำเป็นต้องมีบน VPS
Ubuntu 24.04 ขนาดเล็กเพียงพอสำหรับการใช้งาน SSH และ tmux แต่ Claude Code ต้องการทรัพยากรมากกว่านั้น ข้อกำหนดอย่างเป็นทางการ ณ เดือนตุลาคม 2026 คือ Ubuntu 20.04 หรือใหม่กว่า บนโปรเซสเซอร์ x64 หรือ ARM64 โดยมี RAM ตั้งแต่ 4 GB ขึ้นไป นอกจากนี้ Claude Code ยังต้องการบัญชี Claude แบบชำระเงิน (Pro, Max, Team หรือ Enterprise), บัญชี Console ที่เข้าถึง API ได้ หรือการเข้าถึงผ่านผู้ให้บริการคลาวด์ที่รองรับ เช่น Amazon Bedrock เนื่องจากแผนใช้งานฟรีของ Claude.ai ไม่รวมบริการนี้
ตั้งค่าเซิร์ฟเวอร์โดยใช้ผู้ใช้ทั่วไปที่มีสิทธิ์ sudo ไม่ใช่ root หากเซิร์ฟเวอร์เป็นเครื่องใหม่ ให้ดำเนินการตาม สิบนาทีแรกบน VPS ใหม่ ให้เสร็จสิ้นก่อน เนื่องจากการตั้งค่า SSH ในภายหลังของคู่มือนี้จะทำได้ง่ายขึ้นเมื่อมีผู้ใช้และไฟร์วอลล์พร้อมใช้งานแล้ว
sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --versionตัวติดตั้งจะวางไฟล์ไบนารีไว้ที่ ~/.local/bin/claude และ claude --version จะแสดงผลลัพธ์บรรทัดที่คล้ายกับ 2.1.211 (Claude Code) หากแสดงผลเป็น command not found แสดงว่าไดเรกทอรีดังกล่าวยังไม่อยู่ใน PATH ของคุณ ให้ล็อกเอาต์แล้วล็อกอินใหม่ จากนั้นตรวจสอบด้วย command -v claude ส่วน claude doctor จะแสดงข้อมูลการวินิจฉัยการติดตั้งและการตั้งค่าโดยไม่เริ่มเซสชัน
ให้ล็อกอินเข้าใช้งานหนึ่งครั้งจากแล็ปท็อปก่อนที่คุณจะพึ่งพาโทรศัพท์ รัน claude ในไดเรกทอรีโปรเจกต์และทำตามขั้นตอนการล็อกอิน ระบบจะขอให้คุณเปิด URL ในเบราว์เซอร์และนำรหัสกลับมาใส่ในเทอร์มินัล ซึ่งการสลับแอปไปมาบนหน้าจอโทรศัพท์เพื่อทำขั้นตอนนี้จะทำได้ช้า ให้ทำบนคีย์บอร์ดจริงหนึ่งครั้งแล้วข้อมูลรับรองจะถูกเก็บไว้บนเซิร์ฟเวอร์
เริ่มใช้งาน Claude Code ภายใน tmux เพื่อป้องกันไม่ให้การเชื่อมต่อที่หลุดไปทำให้โปรแกรมหยุดทำงาน
tmux new -s claude
cd ~/projects/api
claudeให้ detach ออกด้วย Ctrl-b แล้วตามด้วย d ระบบ tmux จะแสดง [detached (from session claude)] และคืนค่า shell ให้คุณ จากนั้นคุณสามารถปิดแอปพลิเคชัน สัญญาณอินเทอร์เน็ตขาดหาย หรือเก็บโทรศัพท์ไว้ในกระเป๋าได้โดยที่ pane ดังกล่าวยังคงทำงานอยู่
tmux ls
tmux attach -t claudetmux ls จะแสดงรายการ session ทีละบรรทัด เช่น claude: 1 windows (created Thu Jul 30 09:14:02 2026) ส่วน tmux attach -t claude จะนำคุณกลับไปยังจุดเดิมที่คุณค้างไว้ รวมถึงการแก้ไขไฟล์ที่ยังไม่เสร็จสิ้น
วิธีการนี้ได้ผลเพราะ tmux ทำงานเป็นกระบวนการ server ของตัวเอง โดยที่ shell และ Claude Code ของคุณเป็นกระบวนการลูกของ server นั้น ไม่ใช่ของ sshd เมื่อการเชื่อมต่อ SSH สิ้นสุดลง kernel จะส่งสัญญาณ hangup หรือ SIGHUP ไปยังกระบวนการที่เชื่อมต่ออยู่กับ connection นั้น แต่ server ของ tmux ไม่ได้รับผลกระทบ หากไม่มี tmux การล็อกหน้าจอที่ทำให้การเชื่อมต่อของคุณหลุดจะส่งผลให้ Claude Code หยุดทำงานกลางคันในขณะที่กำลังเรียกใช้เครื่องมือ การรัน Claude Code บน VPS ภายใน tmux ได้อธิบายรายละเอียดเกี่ยวกับการจัดวาง session ไว้ลึกซึ้งยิ่งขึ้น
ให้รัน tmux บนเซิร์ฟเวอร์เท่านั้น ห้ามรันบนโทรศัพท์ การพิมพ์ tmux ภายใน session ที่คุณเชื่อมต่ออยู่แล้วจะแสดง sessions should be nested with care, unset $TMUX to force และหากคุณบังคับใช้งาน จะทำให้เกิดปัญหาปุ่ม prefix สองชุดที่ทับซ้อนกัน
การแนบเซสชันโดยอัตโนมัติเมื่อเข้าสู่ระบบ
การพิมพ์คำสั่ง attach บนคีย์บอร์ดสัมผัสเป็นเรื่องที่น่าเบื่อ ให้เพิ่มคำสั่งนี้ไว้ที่ส่วนท้ายของ ~/.profile บนเซิร์ฟเวอร์:
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
finew-session -A -s claude จะทำการแนบเข้ากับเซสชันที่ชื่อ claude หากมีอยู่ หรือสร้างเซสชันใหม่หากยังไม่มี ดังนั้นคำสั่งเดียวจึงครอบคลุมทั้งสองกรณี exec จะแทนที่ login shell ด้วย tmux ทำให้เมื่อออกจาก tmux การเชื่อมต่อจะถูกตัดแทนที่จะค้างอยู่ที่ prompt ปกติ หากคุณต้องการ shell แบบปกติ ให้ข้ามไฟล์นี้ไปโดยใช้: ssh you@server -t "bash --noprofile"
ให้ใส่คำสั่งนี้ไว้ใน ~/.profile ไม่ใช่ ~/.bashrc โดยปกติ Bash จะอ่าน ~/.bashrc สำหรับคำสั่ง SSH ที่ไม่ใช่แบบโต้ตอบ (non-interactive) แต่การตรวจสอบด้วย [ -t 1 ] ด้านบนจะช่วยป้องกันไม่ให้บล็อกนี้เริ่มทำงาน tmux ระหว่างการโอนย้ายไฟล์ คำสั่งเริ่มต้นที่ไม่มีการป้องกันและมีการแสดงผลลัพธ์ออกมาจะทำให้โปรโตคอลการโอนย้ายไฟล์เกิดข้อผิดพลาด เช่น Received message too long ส่วน ~/.profile จะทำงานเฉพาะกับ login shell เท่านั้น ซึ่งเป็นลักษณะของการเชื่อมต่อ SSH แบบโต้ตอบ
~/.profile ยังเป็นตำแหน่งที่ Ubuntu เพิ่ม ~/.local/bin ลงใน PATH หาก claude ทำงานได้ปกติหลังจากเข้าสู่ระบบ แต่ shell ภายใน tmux กลับแจ้งว่า command not found สาเหตุเกิดจากการเรียงลำดับการทำงาน ดังนั้นควรเริ่ม tmux จาก login shell ตามวิธีข้างต้น แทนที่จะเริ่มจากสคริปต์ที่ข้ามการอ่าน profile ไป
iOS: Termius หรือ Blink Shell
แอปทั้งสองรองรับ SSH และ mosh โดยทั้งคู่จะจัดเก็บกุญแจไว้ภายในแอป ความแตกต่างอยู่ที่อินเทอร์เฟซ
Blink Shell เน้นการสั่งงานด้วยคำสั่ง คุณพิมพ์ ssh you@server หรือ mosh you@server ที่พรอมต์ด้วยไวยากรณ์เดียวกับเทอร์มินัลบนเดสก์ท็อป การตั้งค่าเปิดใช้งานได้โดยพิมพ์ config และส่วน Keys จะสร้างกุญแจคู่ให้คุณ
Termius เน้นการกรอกข้อมูลผ่านฟอร์ม คุณกรอกข้อมูลโฮสต์แล้วเปลี่ยนโหมดจาก SSH เป็น Mosh ในรายละเอียดของโฮสต์ Termius มีการติดตั้ง mosh ในตัวและรองรับ mosh 1.3.0 ขึ้นไป ดังนั้นเซิร์ฟเวอร์ยังคงต้องติดตั้งแพ็กเกจ mosh ไว้
ให้สร้างกุญแจภายในแอปทั้งสองกรณี และห้ามคัดลอก private key ที่มีอยู่แล้วลงในโทรศัพท์ แอปจะแสดง public key ให้คุณเห็น ซึ่งเป็นบรรทัดเดียวที่คุณต้องนำไปเพิ่มใน ~/.ssh/authorized_keys บนเซิร์ฟเวอร์ กุญแจ SSH แยกตามอุปกรณ์และวิธีการเพิกถอน ครอบคลุมเรื่องการตั้งชื่อและขั้นตอนการเพิกถอน ซึ่งมีความสำคัญสำหรับโทรศัพท์มากกว่าแล็ปท็อป
เปิดใช้งานระบบล็อกด้วยไบโอเมตริกหรือรหัสผ่านของแอปเทอร์มินัล หากไม่ทำเช่นนั้น โทรศัพท์ที่ปลดล็อกแล้วจะกลายเป็นช่องทางเข้าถึงเซิร์ฟเวอร์ของคุณได้ทันทีตราบเท่าที่หน้าจอยังเปิดอยู่
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubTermux มีแพ็กเกจ OpenSSH และ mosh อยู่ใน repository ของตนเอง ดังนั้น ssh, ssh-keygen และ mosh จึงทำงานในลักษณะเดียวกับบนเดสก์ท็อป ให้เพิ่มบรรทัด public key ที่แสดงผลลงใน ~/.ssh/authorized_keys บนเซิร์ฟเวอร์ จากนั้นเชื่อมต่อด้วย mosh you@server
คีย์บอร์ดบนหน้าจอของ Android ไม่มีปุ่ม Esc และปุ่ม Ctrl ซึ่ง Claude Code จำเป็นต้องใช้ทั้งสองปุ่ม Termux สามารถแสดงแถวปุ่มพิเศษของตนเองได้ โดยให้เพิ่มบรรทัดนี้ลงใน ~/.termux/termux.properties:
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]จากนั้นรัน termux-reload-settings แล้วแถวปุ่มดังกล่าวจะปรากฏขึ้นเหนือคีย์บอร์ด การโหลดใหม่ด้วยวิธีเดียวกันนี้ยังช่วยให้ระบบเรียกใช้ฟอนต์ TrueType แบบ monospace ที่วางไว้ใน ~/.termux/font.ttf ได้อีกด้วย
Android อาจหยุดการทำงานของ Termux เมื่อแอปทำงานอยู่เบื้องหลัง ซึ่งในกรณีนี้จะไม่มีผลกระทบใดๆ นอกจากคุณต้องเชื่อมต่อใหม่เท่านั้น เนื่องจาก session และ agent ทั้งหมดทำงานอยู่บนเซิร์ฟเวอร์แล้ว
เหตุใด terminal จึงค้างเมื่อหลุดจาก Wi-Fi และ mosh แก้ไขปัญหานี้อย่างไร
การเชื่อมต่อ SSH เป็นการเชื่อมต่อแบบ TCP (transmission control protocol) ซึ่งระบุตัวตนด้วยที่อยู่และพอร์ตของทั้งสองฝั่ง เมื่อคุณเดินออกจากระยะสัญญาณ Wi-Fi โทรศัพท์จะได้รับที่อยู่ใหม่จากเครือข่ายมือถือ ทำให้การเชื่อมต่อเดิมไม่ตรงกับข้อมูลของทั้งสองฝั่งอีกต่อไป โดยไม่มีการแจ้งเตือนใดๆ เกิดขึ้น terminal จะหยุดตอบสนองจนกว่า TCP จะยอมแพ้ แล้ว ssh จึงจะแสดงข้อความ client_loop: send disconnect: Broken pipe หากต้องการตัดการเชื่อมต่อที่ค้างอยู่ทันที ให้กด Enter ตามด้วย ~ แล้วกด .
mosh (mobile shell) กำจัดโหมดความล้มเหลวดังกล่าว โดยใช้ SSH ในการล็อกอินและเริ่มกระบวนการ mosh-server เพียงครั้งเดียว จากนั้นจะอ่านพอร์ต UDP (user datagram protocol) ที่เซิร์ฟเวอร์เลือกใช้ แล้วจึงปิดการเชื่อมต่อ SSH หลังจากนั้นทั้งสองฝั่งจะแลกเปลี่ยน UDP datagram ที่ยืนยันตัวตนด้วย session key ร่วมกัน ทำให้เซสชันถูกระบุด้วยคีย์นั้นแทนที่จะเป็นที่อยู่ของคุณ การเปลี่ยนที่อยู่ใหม่จึงไม่มีผลต่อการเชื่อมต่อ นอกจากนี้ mosh ยังแสดงผลการพิมพ์ของคุณในเครื่องทันทีและอัปเดตหน้าจอใหม่เมื่อข้อมูลจากเซิร์ฟเวอร์ไม่ตรงกัน ซึ่งเป็นเหตุผลที่ทำให้ยังคงใช้งานได้ดีบนเครือข่ายมือถือที่ช้า
mosh ใช้พอร์ต UDP ในช่วง 60000 ถึง 61000 ดังนั้นคุณต้องเปิดพอร์ตช่วงดังกล่าว:
sudo ufw allow 60000:61000/udp
sudo ufw statusการเปิดพอร์ตด้วย ufw มีรายละเอียดเพิ่มเติมเกี่ยวกับ firewall หากผู้ให้บริการของคุณมี network firewall แยกต่างหากในแผงควบคุม คุณต้องเพิ่มช่วงพอร์ตเดียวกันที่นั่นด้วย เนื่องจากกฎของ ufw ไม่สามารถส่งผลต่อตัวกรองที่อยู่หน้าเครื่องเซิร์ฟเวอร์ได้
ปัญหาของ mosh ที่พบบ่อยมี 2 ประการ หากล็อกอินสำเร็จแต่ค้างและแสดงข้อความ Nothing received from server on UDP port 60001. หมายความว่า mosh-server เริ่มทำงานแล้วแต่ฝั่งไคลเอนต์ไม่สามารถเข้าถึงพอร์ต UDP นั้นได้ ซึ่งโดยทั่วไปหมายความว่ามี firewall ระหว่างโทรศัพท์กับเซิร์ฟเวอร์บล็อก UDP ในช่วงของ mosh อยู่ หากการเชื่อมต่อรายงานว่าไม่พบ mosh-server หมายความว่าแพ็กเกจดังกล่าวไม่ได้ติดตั้งบนเซิร์ฟเวอร์หรือไม่มีอยู่ใน PATH ของการล็อกอิน ให้ติดตั้งแพ็กเกจดังกล่าว หรือระบุตำแหน่งโดยตรงด้วย mosh --server=/usr/bin/mosh-server you@server
หาก locale ของการล็อกอินบนเซิร์ฟเวอร์ไม่ใช่ UTF-8 ตัว mosh-server จะพยายามใช้การตั้งค่า locale ที่ส่งมาจากไคลเอนต์และตรวจสอบอีกครั้ง มันจะปฏิเสธการทำงานก็ต่อเมื่อวิธีนั้นไม่สามารถให้ UTF-8 ได้เช่นกัน โดยจะรายงานข้อความ mosh-server needs a UTF-8 native locale to run. ให้แก้ไข locale บนเซิร์ฟเวอร์ก่อน
locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8ทั้งสองฝั่งจำเป็นต้องใช้ UTF-8 locale และ mosh-server จะนำการตั้งค่า locale ที่ไคลเอนต์ส่งมาไปใช้ด้วย หากข้อผิดพลาดยังคงอยู่หลังจากแก้ไขที่เซิร์ฟเวอร์แล้ว ให้ตั้งค่า LANG เป็นค่า UTF-8 ในแอป terminal ของโทรศัพท์ด้วย ซึ่ง FAQ ของ mosh ระบุว่า mosh-client อาจจำเป็นต้องทำเช่นนั้น
มี 2 สิ่งที่ mosh ไม่รองรับ ไฟล์ README ระบุว่า mosh ไม่รองรับ X forwarding หรือการใช้งาน SSH แบบไม่โต้ตอบ (non-interactive) รวมถึง port forwarding ดังนั้นการดูตัวอย่างเว็บแอปที่ Claude Code เพิ่งเริ่มทำงานจึงยังคงต้องใช้ ssh -L 8080:127.0.0.1:8080 you@server แบบปกติ นอกจากนี้ mosh ยังซิงค์เฉพาะหน้าจอที่มองเห็นเท่านั้น จึงไม่มีระบบ scrollback ของตัวเอง ข้อจำกัดประการที่สองนี้ไม่มีผลกระทบในที่นี้ เพราะ tmux จะจัดการเรื่อง scrollback ให้: กด Ctrl-b ตามด้วย [ เพื่อเข้าสู่โหมดคัดลอก (copy mode) จากนั้นใช้การลากเมาส์หรือปุ่มลูกศรเพื่อเลื่อนดู และกด q เพื่อออก
ทำให้หน้าจอโทรศัพท์ใช้งานได้จริง
การตั้งค่าสี่บรรทัดใน ~/.tmux.conf บนเซิร์ฟเวอร์จะช่วยจัดการงานส่วนใหญ่ให้คุณ:
set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000mouse on จะเปลี่ยนการลากนิ้วให้เป็นการเลื่อนหน้าจอ และเปลี่ยนการแตะให้เป็นการเลือกบานหน้าต่างหรือหน้าต่าง ซึ่งช่วยแทนที่ปุ่ม prefix ส่วนใหญ่ที่พิมพ์ยาก status-position top จะย้ายแถบสถานะของ tmux ออกจากขอบด้านล่าง ซึ่งเป็นตำแหน่งที่คีย์บอร์ดบนหน้าจอและแถบคำแนะนำมักจะบังอยู่ default-terminal จะเป็นการกำหนดชื่อ terminal ที่ tmux แจ้งให้ Claude Code ทราบ หากไม่มีบรรทัดนี้ tmux จะแจ้งชื่อตามที่ถูกตั้งค่าไว้ตอน build สคริปต์ configure ของ tmux 3.4 จะเริ่มจาก screen จากนั้นทดสอบ screen-256color, tmux และ tmux-256color ตามลำดับ หากการทดสอบล้มเหลว ระบบจะใช้ค่าเดิมที่เลือกไว้ ดังนั้น build ที่หา entry ของ terminfo tmux-256color ไม่พบ จะจบลงด้วยการใช้ tmux, screen-256color หรือ screen แบบปกติ ซึ่งอาจทำให้สีและการวาดกรอบแสดงผลได้ไม่ดีเท่าที่ควร
เรียนรู้ปุ่มสี่ปุ่มนี้แล้วที่เหลือจะใช้งานได้สะดวกขึ้น
Escใช้ขัดจังหวะ Claude ระหว่างการตอบและเก็บงานที่ทำเสร็จแล้วไว้ ดังนั้นจึงเป็นปุ่มที่คุณควรวางไว้ใกล้กับนิ้วโป้งมากที่สุดCtrl+Cใช้ขัดจังหวะการทำงานที่กำลังรันอยู่เช่นกัน ในขณะที่ prompt ว่างอยู่ การกดครั้งแรกจะเป็นการล้างข้อมูลที่พิมพ์ไว้ และการกดครั้งที่สองจะเป็นการออกจาก Claude Code จึงถือเป็นเครื่องมือที่รุนแรงกว่าEscกดสองครั้งเพื่อล้าง prompt ที่ร่างไว้ และหาก prompt ว่างอยู่จะเป็นการเปิดเมนู rewind แทน- สำหรับ prompt หลายบรรทัด ให้พิมพ์
\แล้วตามด้วย Enter รูปแบบนี้ใช้งานได้ในทุก terminal ส่วน Shift+Enter จะใช้งานได้เฉพาะใน desktop terminal บางตัวเท่านั้น ซึ่งไม่รวมถึงไคลเอนต์บนมือถือ
หลีกเลี่ยงการแบ่งหน้าต่าง (split panes) โทรศัพท์ในแนวตั้งมีความกว้างประมาณ 40 คอลัมน์ การแบ่งแนวตั้งจะเหลือพื้นที่เพียง 20 คอลัมน์ต่อบานหน้าต่าง ซึ่งจะทำให้ diff ทุกอย่างแสดงผลซ้อนทับกันจนอ่านไม่รู้เรื่อง ให้ใช้หน้าต่าง tmux แทน โดย Ctrl-b c ใช้สร้างหน้าต่างใหม่และ Ctrl-b n ใช้สลับไปยังหน้าต่างถัดไป หากหน้าต่างที่สองมีเซสชัน Claude Code ของตัวเอง ทั้งสองเซสชันสามารถส่งต่องานถึงกันได้โดยตรง แทนที่คุณจะต้องคัดลอกข้อความระหว่างหน้าต่างบนหน้าจอสัมผัส ให้หมุนโทรศัพท์เป็นแนวนอนเมื่อต้องการอ่าน diff อย่างละเอียด
ปริมาณข้อความที่แสดงบนหน้าจอนั้นคุ้มค่าที่จะตั้งค่าอย่างตั้งใจ เพราะ รูปแบบการแสดงผลจะแก้ไข system prompt ในทุกการตอบกลับ และการตั้งค่าให้กระชับขึ้นจะช่วยลดจำนวนหน้าจอที่ต้องเลื่อนผ่านบนโทรศัพท์
เซสชันที่ยาวนานบนหน้าจอขนาดเล็กมักเป็นปัญหาเรื่องบริบท ดังนั้น การจัดการ context window ของ Claude Code จึงเป็นเรื่องที่ควรอ่านก่อนที่คุณจะพยายามทำงานเต็มวันจากบนรถไฟ
การจำกัดสิทธิ์: ใช้เฉพาะคีย์ ไม่ใช้รหัสผ่าน
ขณะนี้โทรศัพท์ของคุณเก็บคีย์สำหรับเข้าถึงเครื่องที่ใช้แก้ไขโค้ดและรันคำสั่งแล้ว ให้ปิดการยืนยันตัวตนด้วยรหัสผ่าน การใช้ไฟล์ drop-in ปลอดภัยกว่าการแก้ไข sshd_config โดยตรง เนื่องจาก sshd_config ของ Ubuntu มีการรวม /etc/ssh/sshd_config.d/*.conf ไว้ที่ส่วนบนสุด และค่าแรกที่พบสำหรับการตั้งค่าใดๆ จะถูกนำไปใช้งาน
sudo tee /etc/ssh/sshd_config.d/00-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload sshไฟล์ drop-in จะถูกอ่านตามลำดับชื่อไฟล์ ให้ตรวจสอบ sudo sshd -T สำหรับ passwordauthentication no, kbdinteractiveauthentication no, pubkeyauthentication yes และ permitrootlogin no หากมีไฟล์ก่อนหน้าที่กำหนดค่าเหล่านี้ไว้ ไฟล์นั้นจะมีผลเหนือกว่าและจำเป็นต้องแก้ไขที่ไฟล์นั้น
sshd -t จะตรวจสอบความถูกต้องของไฟล์ config และไม่แสดงผลใดๆ หากค่าถูกต้อง หากข้ามขั้นตอนนี้ไปและเกิดพิมพ์ผิดเพียงจุดเดียว จะทำให้ sshd ล้มเหลวเมื่อสั่ง reload ให้คงเซสชันที่ใช้งานอยู่ไว้และทดสอบการเชื่อมต่อจากช่องทางที่สองก่อนปิดเซสชันใดๆ เพราะหากคีย์ผิดพลาดในตอนนี้ คุณจะได้รับ Permission denied (publickey). และเมื่อปิดรหัสผ่านไปแล้ว จะไม่มีช่องทางสำรองอื่น วิธีการกู้คืนในจุดนั้นคือการใช้คอนโซลของผู้ให้บริการ หากการทดสอบการเชื่อมต่อล้มเหลว ให้เชื่อมต่อใหม่ด้วย ssh -v และแก้ไขปัญหาในขณะที่เซสชันแรกยังเปิดอยู่ เพราะ ข้อความแสดงข้อผิดพลาดนั้นครอบคลุมถึง 5 สาเหตุที่แตกต่างกัน และการแสดงผลแบบละเอียดจะบอกคุณว่าคุณกำลังเจอปัญหาใด
กำหนดคีย์แยกสำหรับอุปกรณ์แต่ละเครื่อง การทำโทรศัพท์หายจะหมายถึงการลบเพียงบรรทัดเดียวออกจาก ~/.ssh/authorized_keys และแล็ปท็อปของคุณจะยังคงใช้งานได้ตามปกติ การใช้คีย์ร่วมกันหมายถึงคุณต้องเปลี่ยนคีย์ในทุกอุปกรณ์ที่คุณมี
หากคุณย้าย SSH ไปยังพอร์ตอื่นบน Ubuntu 24.04 โปรดทราบว่าตัวรับฟัง (listener) เป็นของ ssh.socket ระบบ systemd generator จะสร้าง socket นั้นจากบรรทัด Port ในไฟล์ config ของ SSH ดังนั้นคุณไม่จำเป็นต้องใช้ ListenStream override แต่การรีสตาร์ท ssh เพียงอย่างเดียวจะทำให้เซิร์ฟเวอร์ยังคงฟังอยู่ที่พอร์ต 22 ให้ใส่บรรทัด Port ไว้ในไฟล์ drop-in, อนุญาตพอร์ตใหม่ใน ufw จากนั้นรัน sudo systemctl daemon-reload ตามด้วย sudo systemctl restart ssh.socket เนื้อหา การเพิ่มความปลอดภัยให้ SSH บน VPS ครอบคลุมเรื่องนี้และส่วนอื่นๆ ทั้งหมด
fail2ban สำหรับ SSH ช่วยเพิ่มความปลอดภัยได้เพียงเล็กน้อยเมื่อปิดการใช้รหัสผ่านแล้ว เพราะรหัสผ่านที่เดาสุ่มจะไม่สามารถใช้งานได้เลย สิ่งที่เพิ่มเข้ามาคือ log ที่สะอาดขึ้น ซึ่งทำให้สังเกตเห็นความพยายามในการล็อกอินจริงได้ง่าย
ทางเลือกที่แข็งแกร่งกว่าคือการไม่เปิด SSH สู่สาธารณะบนอินเทอร์เน็ต ให้วางเซิร์ฟเวอร์ไว้หลัง WireGuard VPN ที่คุณโฮสต์เอง เปิดใช้งาน tunnel บนโทรศัพท์เมื่อต้องการ และกำหนดให้ sshd ฟังที่ ListenAddress เฉพาะบน tunnel เท่านั้น mosh สามารถทำงานผ่าน tunnel ได้เนื่องจากทั้งสองฝั่งใช้ UDP ข้อควรระวังคือ tunnel จะเพิ่ม packet overhead ดังนั้นหากการโอนถ่ายข้อมูลขนาดใหญ่หยุดชะงัก ให้ลดค่า MTU (maximum transmission unit) ในไฟล์ config ของ WireGuard บนโทรศัพท์
ประเด็นสุดท้ายเกี่ยวกับการทำงานในรูปแบบนี้ จากโทรศัพท์คุณต้องอนุมัติการแจ้งเตือนสิทธิ์บนหน้าจอที่แสดง diff ทีละไม่กี่บรรทัด นี่เป็นเหตุผลที่ควรคงระบบป้องกันไว้แทนที่จะปิดมัน ตรวจสอบโหมดสิทธิ์ที่เซสชันของคุณเริ่มต้นด้วยเช่นกัน เพราะ โหมด auto เป็นโหมดเริ่มต้นในตัว สำหรับเซสชัน terminal แบบโต้ตอบจาก Claude Code v2.1.283 ซึ่งจะทำการแก้ไขไฟล์ในไดเรกทอรีทำงานโดยไม่หยุดถามคุณ เนื้อหา การรัน Claude Code อย่างปลอดภัยบน VPS ครอบคลุมถึงการจำกัดสิทธิ์ผู้ใช้และไดเรกทอรีที่ควรตั้งค่าก่อนที่ช่องทางหลักในการเข้าถึงของคุณจะเป็นหน้าจอสัมผัส
เมื่อคุณเชื่อมต่อเซสชันกลับมาแล้วพบว่ามีสิ่งผิดปกติเกิดขึ้น
tmux attach ที่แสดงผล no server running on /tmp/tmux-1000/default หมายความว่า tmux ไม่พบเซิร์ฟเวอร์บนซ็อกเก็ตนั้น โดยปกติแล้วเซิร์ฟเวอร์อาจหายไป ซึ่งเกือบจะหมายความว่าเครื่องได้รีบูต ให้ตรวจสอบด้วย uptime หากเครื่องไม่ได้รีบูตและ pgrep tmux ยังคงแสดงเซิร์ฟเวอร์อยู่ นั่นไม่ได้หมายความว่าไฟล์ซ็อกเก็ตถูกลบไปเสมอไป เพราะแฟล็ก -L และ -S ช่วยให้เซิร์ฟเวอร์ฟังบนซ็อกเก็ตอื่นได้ หากคุณเริ่ม tmux ด้วยแฟล็กเหล่านี้ ให้ส่งแฟล็กเดียวกันไปยัง tmux attach หากซ็อกเก็ตถูกลบโดยไม่ได้ตั้งใจจริงๆ pkill -USR1 tmux จะสั่งให้เซิร์ฟเวอร์สร้างซ็อกเก็ตขึ้นมาใหม่ ซึ่งคู่มือ tmux ระบุว่าจะล้มเหลวหากไดเรกทอรีหลักหายไป การอัปเดตเคอร์เนลจาก การอัปเดตความปลอดภัยอัตโนมัติ จำเป็นต้องรีบูตเพื่อให้มีผล แต่ unattended-upgrades จะรีบูตอัตโนมัติก็ต่อเมื่อเปิดใช้งาน Unattended-Upgrade::Automatic-Reboot ไว้เท่านั้น โดยค่าเริ่มต้นคือ false เครื่องที่รีบูตจะไม่มีเซสชัน tmux ดังนั้นให้ถือว่าการรัน Claude Code ทุกครั้งเป็นสิ่งที่สามารถเริ่มใหม่ได้
can't find session: claude นั้นต่างออกไป คือเซิร์ฟเวอร์ tmux กำลังทำงานอยู่แต่ไม่มีชื่อนั้นปรากฏขึ้น tmux ls จะแสดงสิ่งที่อยู่ในระบบจริง
หากคุณเชื่อมต่อแล้วพบเพียง shell prompt แทนที่จะเป็น Claude Code แสดงว่ากระบวนการทำงานสิ้นสุดลงโดยที่เซสชันยังไม่ปิด ให้ดูที่ dmesg -T | tail เพื่อหาบรรทัดที่คล้ายกับ Out of memory: Killed process 4821 (claude) ซึ่งเป็นการยืนยันว่าถูกสั่ง kill เนื่องจากหน่วยความจำไม่เพียงพอ (out-of-memory) ให้ตรวจสอบประวัติการเลื่อนหน้าจอของเชลล์เหนือ prompt เพื่อดูข้อความแจ้งเตือนการปิดโปรแกรมอื่นๆ
หน้าต่างที่กลับมาด้วยขนาดที่ไม่ถูกต้อง ถูกตัดขอบ หรือมีพื้นที่ว่างรอบๆ หมายความว่ามีไคลเอนต์สองเครื่องเชื่อมต่ออยู่ด้วยขนาดที่ต่างกัน โดยค่าเริ่มต้น tmux 3.4 จะปรับขนาดหน้าต่างตามไคลเอนต์ที่มีการใช้งานล่าสุด (window-size latest) ดังนั้นแล็ปท็อปของคุณที่เชื่อมต่อด้วยความกว้าง 200 คอลัมน์ และโทรศัพท์ที่ 40 คอลัมน์ จะผลัดกันปรับขนาดหน้าต่าง ให้ตัดการเชื่อมต่อเครื่องอื่นออกในขณะที่คุณเชื่อมต่อด้วยคำสั่ง: tmux attach -d -t claude
FAQ
ฉันสามารถรัน Claude Code บนโทรศัพท์โดยตรงแทนการใช้ VPS ได้หรือไม่?
CLI ของเทอร์มินัลไม่รองรับบน Android หรือ iOS แพลตฟอร์มที่รองรับ ณ เดือนตุลาคม 2026 ได้แก่ macOS, Windows, Ubuntu 20.04 หรือใหม่กว่า, Debian 10 หรือใหม่กว่า และ Alpine 3.19 หรือใหม่กว่า โดยต้องมี RAM 4 GB ขึ้นไป Android และ iOS ไม่อยู่ในรายการนี้ นอกจากนี้โทรศัพท์มักจะทำให้แอปเข้าสู่โหมดพักและเปลี่ยนที่อยู่เครือข่ายอยู่ตลอดเวลา ซึ่งเป็นสิ่งที่การรัน agent เป็นเวลานานไม่สามารถรองรับได้ ควรติดตั้งบนเซิร์ฟเวอร์แล้วใช้โทรศัพท์เป็นหน้าจอแสดงผลแทน
เซสชันจะยังคงอยู่หรือไม่หากฉันปิดแอปหรือสัญญาณขาดหาย?
ใช่ โดยมีส่วนประกอบสองส่วนที่ทำหน้าที่นี้ tmux จะรักษาให้กระบวนการทำงานบนเซิร์ฟเวอร์ต่อไป ดังนั้นจึงไม่มีอะไรหยุดทำงานเมื่อการเชื่อมต่อสิ้นสุดลง mosh จะรักษาการเชื่อมต่อให้คงอยู่แม้มีการเปลี่ยนที่อยู่เครือข่าย ดังนั้นการสลับจาก Wi-Fi ไปเป็นข้อมูลมือถือจึงไม่จำเป็นต้องเชื่อมต่อใหม่ หากใช้ SSH ปกติโดยไม่มี tmux การเชื่อมต่อที่หลุดจะส่งสัญญาณ SIGHUP และทำให้ Claude Code หยุดทำงานกลางคัน
ทำไม mosh เชื่อมต่อได้แต่ไม่แสดงผลอะไรเลย?
การล็อกอินที่สำเร็จแต่ค้างอยู่ที่ Nothing received from server on UDP port 60001. หมายความว่าไคลเอนต์ไม่สามารถเข้าถึง mosh-server บนพอร์ต UDP นั้นได้ ซึ่งโดยทั่วไปหมายความว่าไฟร์วอลล์กำลังบล็อกช่วงพอร์ต UDP 60000 ถึง 61000 ให้เพิ่มช่วงพอร์ตดังกล่าวใน ufw และเพิ่มในไฟร์วอลล์เครือข่ายของผู้ให้บริการของคุณด้วย ซึ่งมักจะเป็นการตั้งค่าแยกต่างหากในแผงควบคุมส่วนใหญ่ หาก mosh รายงานว่าไม่พบ mosh-server แสดงว่าเซิร์ฟเวอร์ไม่มีแพ็กเกจดังกล่าวหรือ shell ล็อกอิน PATH ของคุณไม่ได้รวมไว้ ให้ติดตั้งด้วย sudo apt install mosh หรือใช้ mosh --server=/usr/bin/mosh-server you@server
ฉันจะขัดจังหวะ Claude Code จากคีย์บอร์ดที่ไม่มีปุ่ม Esc ได้อย่างไร?
ให้เพิ่มแถวปุ่มพิเศษ Termux สามารถกำหนดค่าได้ด้วย extra-keys ใน ~/.termux/termux.properties ส่วน Termius และ Blink มีแถวปุ่มที่สามารถแก้ไขได้ในการตั้งค่า Esc จะขัดจังหวะการตอบสนองที่กำลังทำงานอยู่และเก็บงานที่ทำเสร็จแล้วไว้ Ctrl+C ก็สามารถขัดจังหวะได้เช่นกัน แต่หากกดสองครั้งในขณะที่ prompt ว่างอยู่จะเป็นการออกจาก Claude Code ดังนั้นควรใช้ Esc เป็นอันดับแรก
การเปิด SSH สู่สาธารณะปลอดภัยเพียงพอสำหรับวิธีนี้หรือไม่?
หากปิดการตรวจสอบสิทธิ์ด้วยรหัสผ่าน ข้อมูลรับรองเดียวที่จะใช้งานได้คือคีย์ที่ไม่ได้ออกจากอุปกรณ์ของคุณ ซึ่งถือเป็นความเสี่ยงที่ยอมรับได้สำหรับเครื่องที่คุณสามารถสร้างใหม่ได้ตลอดเวลา ให้คีย์แยกกันสำหรับแต่ละอุปกรณ์ เพื่อที่ว่าหากโทรศัพท์หาย คุณจะเสียเวลาเพียงแค่ลบหนึ่งบรรทัดใน authorized_keys หากคุณไม่ต้องการเปิดพอร์ตสาธารณะเลย ให้วางเซิร์ฟเวอร์ไว้หลัง WireGuard และให้ sshd ฟังบนที่อยู่ของ tunnel แทน