SSD Nodes Learn RAM 8GB — $66/ปี
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-01

วิธีใช้งาน Claude Code บนมือถือผ่าน SSH และ tmux

เรียนรู้วิธีรัน Claude Code บน VPS ด้วย tmux เพื่อให้ใช้งานผ่านมือถือได้ต่อเนื่องโดยไม่หลุดแม้เน็ตไม่เสถียร พร้อมตั้งค่า Mosh และ SSH keys เพื่อการเชื่อมต่อที่เสถียรที่สุด

Claude Code จากโทรศัพท์ของคุณ: หลักการทำงานจริง

Claude Code จากโทรศัพท์ของคุณไม่ใช่แอปพลิเคชันบนมือถือ Claude Code ทำงานบน VPS (virtual private server) ภายในเซสชัน tmux ที่เปิดค้างไว้ โดยโทรศัพท์ของคุณจะเปิดการเชื่อมต่อ SSH (secure shell) ไปยังเซสชันนั้นตราบเท่าที่คุณยังคงใช้งานอยู่ เมื่อคุณปิดแอปพลิเคชัน ตัวเอเจนต์จะยังคงทำงานต่อไป เนื่องจากกระบวนการทำงานไม่ได้เกิดขึ้นบนโทรศัพท์ตั้งแต่แรก

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

คุณจำเป็นต้องมีองค์ประกอบ 4 อย่างบนเซิร์ฟเวอร์: tmux สำหรับคงเซสชันไว้, SSH keys สำหรับการเข้าถึง, mosh สำหรับจัดการการเปลี่ยนแปลงเครือข่าย และตัว Claude Code เอง ในส่วนของโทรศัพท์ คุณเพียงแค่ต้องมีแอปพลิเคชันเทอร์มินัลที่มีแถวปุ่มกดที่คุณสามารถใช้งานได้สะดวก

สิ่งที่คุณต้องมีบน VPS

เซิร์ฟเวอร์ Ubuntu 24.04 ขนาดเล็กเพียงพอสำหรับการใช้งาน SSH และ tmux แต่ Claude Code ต้องการทรัพยากรมากกว่านั้น ข้อกำหนดอย่างเป็นทางการ ณ เดือนกรกฎาคม 2026 คือ Ubuntu 20.04 หรือใหม่กว่า บนโปรเซสเซอร์ x64 หรือ ARM64 และต้องมี RAM ขนาด 4 GB ขึ้นไป แผนบริการขนาด 1 GB สามารถติดตั้งโปรแกรมได้ แต่กระบวนการทำงานจะถูก kernel สั่งยุติเมื่อมีการใช้งานหนัก นอกจากนี้ Claude Code ยังต้องการบัญชี Claude แบบชำระเงิน (Pro, Max, Team หรือ Enterprise) หรือบัญชี Console ที่เข้าถึง API ได้ เนื่องจากแผนการใช้งาน 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)] และส่งคืนการควบคุมเชลล์ให้กับคุณ จากนั้นคุณสามารถปิดแอปพลิเคชัน สัญญาณอินเทอร์เน็ตขาดหาย หรือเก็บโทรศัพท์ไว้ในกระเป๋าได้ โดยที่หน้าต่างการทำงานจะยังคงรันอยู่ต่อไป

tmux ls
tmux attach -t claude

tmux ls จะแสดงรายการเซสชันโดยแบ่งเป็นบรรทัดละหนึ่งเซสชัน เช่น claude: 1 windows (created Thu Jul 30 09:14:02 2026) คำสั่ง tmux attach -t claude จะนำคุณกลับไปยังจุดเดิมที่คุณค้างไว้ รวมถึงงานแก้ไขที่ยังไม่เสร็จสิ้น

วิธีการนี้ได้ผลเนื่องจาก tmux ทำงานเป็นกระบวนการเซิร์ฟเวอร์แยกต่างหาก โดยที่เชลล์และ Claude Code ของคุณเป็นกระบวนการลูกของเซิร์ฟเวอร์นั้น ไม่ใช่ของ sshd เมื่อการเชื่อมต่อ SSH สิ้นสุดลง เคอร์เนลจะส่งสัญญาณ SIGHUP ไปยังกระบวนการที่เชื่อมต่ออยู่กับคอนเนกชันนั้น แต่เซิร์ฟเวอร์ของ tmux ไม่ได้รับสัญญาณดังกล่าว หากไม่มี tmux การล็อกหน้าจอที่ทำให้การเชื่อมต่อของคุณหลุดจะส่งผลให้ Claude Code หยุดทำงานในระหว่างการเรียกใช้เครื่องมือ การรัน Claude Code บน VPS ภายใน tmux ได้อธิบายรายละเอียดเกี่ยวกับการจัดวางเซสชันไว้ลึกซึ้งยิ่งขึ้น

ให้รัน tmux บนเซิร์ฟเวอร์เท่านั้น ห้ามรันบนโทรศัพท์ การพิมพ์ tmux ภายในเซสชันที่คุณเชื่อมต่ออยู่แล้วจะแสดงข้อความ sessions should be nested with care, unset $TMUX to force และหากคุณบังคับใช้งาน จะทำให้เกิดปัญหาปุ่มคำสั่งนำหน้า (prefix key) สองชุดที่ทับซ้อนกัน

เชื่อมต่อโดยอัตโนมัติเมื่อเข้าสู่ระบบทุกครั้ง

การพิมพ์คำสั่ง attach บนคีย์บอร์ดสัมผัสเป็นเรื่องที่น่าเบื่อ ให้เพิ่มคำสั่งนี้ไว้ที่ท้ายไฟล์ ~/.profile บนเซิร์ฟเวอร์:

if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
  exec tmux new-session -A -s claude
fi

new-session -A -s claude จะทำการเชื่อมต่อกับเซสชันที่ชื่อ claude หากมีอยู่จริง และจะสร้างเซสชันขึ้นมาใหม่หากยังไม่มี ดังนั้นคำสั่งเดียวจึงครอบคลุมทั้งสองกรณี exec จะเข้ามาแทนที่เชลล์เริ่มต้นด้วย tmux ดังนั้นเมื่อออกจาก tmux การเชื่อมต่อจะถูกตัดไปเลยแทนที่จะค้างอยู่ที่พรอมต์ว่างๆ หากคุณต้องการใช้งานเชลล์ปกติ ให้ข้ามไฟล์นี้ไปโดยใช้: ssh you@server -t "bash --noprofile"

ให้ใส่คำสั่งนี้ไว้ใน ~/.profile ไม่ใช่ใน ~/.bashrc เนื่องจาก ~/.bashrc จะทำงานในเซสชันที่ไม่ใช่แบบโต้ตอบด้วย ซึ่งจะทำให้การถ่ายโอนไฟล์เกิดข้อผิดพลาด เพราะ scp และ sftp จะอ่านเอาต์พุตที่ไม่คาดคิดว่าเป็นข้อมูลโปรโตคอลและล้มเหลวพร้อมข้อความ Received message too long ส่วน ~/.profile จะทำงานเฉพาะกับเชลล์ที่ล็อกอินเข้ามาเท่านั้น ซึ่งเป็นลักษณะของเซสชัน SSH แบบโต้ตอบ

~/.profile ยังเป็นที่ที่ Ubuntu ใช้เพิ่ม ~/.local/bin ลงใน PATH หาก claude ทำงานได้ถูกต้องหลังจากล็อกอิน แต่เชลล์ภายใน tmux กลับแจ้งว่า command not found สาเหตุเกิดจากการเรียงลำดับดังกล่าว ดังนั้นควรเริ่ม tmux จากเชลล์ล็อกอินตามที่ระบุไว้ข้างต้น แทนที่จะเริ่มจากสคริปต์ที่ข้ามการอ่านโปรไฟล์ไป

แอปพลิเคชันทั้งสองรองรับโปรโตคอล 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 half) ซึ่งเป็นบรรทัดเดียวที่คุณต้องนำไปเพิ่มใน ~/.ssh/authorized_keys บนเซิร์ฟเวอร์ คีย์ SSH แยกตามอุปกรณ์และวิธีการเพิกถอนคีย์ ครอบคลุมเรื่องการตั้งชื่อและขั้นตอนการเพิกถอน ซึ่งมีความสำคัญสำหรับโทรศัพท์มากกว่าแล็ปท็อป

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

Android: Termux

pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pub

Termux มีแพ็กเกจ OpenSSH และ mosh อยู่ในคลังซอฟต์แวร์ของตนเอง ดังนั้น 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 ในขณะที่แอปทำงานอยู่เบื้องหลัง ซึ่งในกรณีนี้จะไม่มีผลกระทบใดๆ นอกจากคุณต้องเชื่อมต่อใหม่เท่านั้น เนื่องจากเซสชันและ agent ยังคงทำงานอยู่บนเซิร์ฟเวอร์

เหตุใดเทอร์มินัลจึงค้างเมื่อออกจาก Wi-Fi และ mosh แก้ไขปัญหาได้อย่างไร

การเชื่อมต่อ SSH เป็นการเชื่อมต่อแบบ TCP (transmission control protocol) ซึ่งระบุตัวตนด้วยที่อยู่และพอร์ตของทั้งสองฝั่ง เมื่อคุณเดินออกจากระยะสัญญาณ Wi-Fi โทรศัพท์จะได้รับที่อยู่ใหม่จากเครือข่ายมือถือ ทำให้การเชื่อมต่อเดิมไม่ตรงกับข้อมูลในฝั่งใดฝั่งหนึ่งอีกต่อไป โดยไม่มีการแจ้งเตือนใดๆ เกิดขึ้น เทอร์มินัลจะหยุดตอบสนองจนกว่า TCP จะยอมแพ้ จากนั้น ssh จะแสดงข้อความ client_loop: send disconnect: Broken pipe หากต้องการยุติเซสชันที่ค้างอยู่ทันที ให้กด Enter ตามด้วย ~ และ .

mosh (mobile shell) ช่วยขจัดปัญหาดังกล่าว โดยใช้ SSH ในการล็อกอินและเริ่มกระบวนการ mosh-server เพียงครั้งเดียว จากนั้นจะอ่านพอร์ต UDP (user datagram protocol) ที่เซิร์ฟเวอร์เลือกใช้ แล้วจึงปิดการเชื่อมต่อ SSH หลังจากนั้นทั้งสองฝั่งจะแลกเปลี่ยนข้อมูลผ่าน UDP datagram ที่ยืนยันความถูกต้องด้วยคีย์เซสชันร่วมกัน ทำให้เซสชันถูกระบุด้วยคีย์นั้นแทนที่จะเป็นที่อยู่ของคุณ ดังนั้นเมื่อได้รับที่อยู่ใหม่ การเชื่อมต่อจึงยังคงดำเนินต่อไปได้ นอกจากนี้ mosh ยังแสดงผลการพิมพ์ของคุณในเครื่องทันทีและอัปเดตหน้าจอใหม่เมื่อข้อมูลจากเซิร์ฟเวอร์ไม่ตรงกัน ซึ่งเป็นเหตุผลที่ทำให้ใช้งานได้ดีบนเครือข่ายมือถือที่ช้า

mosh ใช้พอร์ต UDP ในช่วง 60000 ถึง 61000 ดังนั้นคุณต้องเปิดช่วงพอร์ตดังกล่าว:

sudo ufw allow 60000:61000/udp
sudo ufw status

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

ปัญหาที่พบบ่อยของ mosh มีสองประการ หากล็อกอินสำเร็จแต่ค้างและแสดงข้อความ Nothing received from server on UDP port 60001. แสดงว่าช่วงพอร์ต UDP ถูกบล็อกไว้ที่จุดใดจุดหนึ่งระหว่างโทรศัพท์กับเซิร์ฟเวอร์ หากการเชื่อมต่อรายงานว่า mosh-server ไม่พบ แสดงว่าแพ็กเกจไม่ได้ติดตั้งอยู่บนเซิร์ฟเวอร์หรือไม่มีอยู่ใน PATH ของการล็อกอิน ให้ติดตั้งแพ็กเกจดังกล่าว หรือระบุตำแหน่งโดยตรงด้วย mosh --server=/usr/bin/mosh-server you@server

นอกจากนี้ mosh จะปฏิเสธการทำงานหาก 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

มีสองสิ่งที่ mosh ไม่รองรับ ไฟล์ README ระบุว่า mosh ไม่รองรับ X forwarding หรือการใช้งาน SSH แบบไม่โต้ตอบ รวมถึงการทำ port forwarding ดังนั้นการดูตัวอย่างเว็บแอปที่ Claude Code เพิ่งเริ่มทำงานจึงยังคงต้องใช้ ssh -L 8080:127.0.0.1:8080 you@server แบบปกติ นอกจากนี้ mosh ยังซิงโครไนซ์เฉพาะหน้าจอที่มองเห็นเท่านั้น จึงไม่มีระบบ scrollback ของตัวเอง ข้อจำกัดประการที่สองนี้ไม่มีผลกระทบในที่นี้ เนื่องจาก tmux จัดการเรื่อง scrollback ไว้ให้แล้ว: Ctrl-b ตามด้วย [ เพื่อเข้าสู่โหมดคัดลอก (copy mode) จากนั้นใช้การลากเมาส์หรือปุ่มลูกศรเพื่อเลื่อนดู และกด q เพื่อออก

Make a phone screen usable

Four lines in ~/.tmux.conf on the server do most of the work:

set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000

mouse on turns a touch drag into a scroll and a tap into a pane or window selection, which replaces most of the prefix keys that are awkward to type. status-position top moves the tmux status line off the bottom edge, where the on-screen keyboard and its suggestion bar cover it. default-terminal matters because tmux otherwise announces a screen terminal to Claude Code, and colours and box drawing come out worse than they need to. If tmux then refuses to start with missing or unsuitable terminal: tmux-256color, the terminfo entry is missing: sudo apt install ncurses-term.

Learn four keys and the rest is comfortable.

  • Esc interrupts Claude mid-response and keeps the work already done, so it is the key you want closest to your thumb.
  • Ctrl+C interrupts a running operation as well. At an idle prompt the first press clears the input and a second press exits Claude Code, so it is the blunter tool.
  • Esc twice clears a draft prompt, and at an empty prompt it opens the rewind menu instead.
  • For a multi-line prompt, type \ and then Enter. That form works in every terminal. Shift+Enter is native only in a short list of desktop terminals, and the mobile clients are not in it.

Avoid split panes. A phone in portrait is around 40 columns wide, so a vertical split leaves 20 columns per pane and every diff wraps into noise. Use tmux windows instead: Ctrl-b c creates one and Ctrl-b n moves to the next. Turn the phone sideways when you need to read a diff properly.

A long session on a small screen is mostly a context problem, so managing the Claude Code context window is worth reading before you try to run a full day of work from a train.

การจำกัดสิทธิ์: ใช้เฉพาะคีย์ ไม่ใช้รหัสผ่าน

ขณะนี้โทรศัพท์ของคุณมีคีย์สำหรับเข้าถึงเครื่องที่ใช้แก้ไขโค้ดและรันคำสั่งแล้ว ให้ปิดการยืนยันตัวตนด้วยรหัสผ่าน การใช้ไฟล์แบบ drop-in นั้นปลอดภัยกว่าการแก้ไข sshd_config โดยตรง เนื่องจาก sshd_config ของ Ubuntu จะรวม /etc/ssh/sshd_config.d/*.conf ไว้ที่ส่วนบนสุด และค่าการตั้งค่าที่พบเป็นลำดับแรกจะถูกนำไปใช้งาน

sudo tee /etc/ssh/sshd_config.d/99-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload ssh

sshd -t จะตรวจสอบไฟล์คอนฟิกและไม่แสดงผลลัพธ์ใดๆ หากไฟล์ถูกต้อง หากข้ามขั้นตอนนี้ไปและเกิดพิมพ์ผิดเพียงจุดเดียว จะทำให้ sshd ล้มเหลวเมื่อโหลดการตั้งค่าใหม่ ให้เปิดเซสชันที่ใช้งานอยู่ทิ้งไว้และทดสอบจากการเชื่อมต่อที่สองก่อนปิดเซสชันใดๆ เพราะหากคีย์ผิดพลาดในตอนนี้ คุณจะได้รับ Permission denied (publickey). และเมื่อปิดการใช้รหัสผ่านแล้ว จะไม่มีช่องทางสำรองอีก วิธีการกู้คืนในจุดนั้นคือการใช้คอนโซลของผู้ให้บริการของคุณ

กำหนดคีย์แยกสำหรับอุปกรณ์แต่ละเครื่อง หากทำโทรศัพท์หาย คุณเพียงแค่ลบหนึ่งบรรทัดออกจาก ~/.ssh/authorized_keys และแล็ปท็อปของคุณจะยังคงใช้งานได้ตามปกติ การใช้คีย์ร่วมกันหมายความว่าคุณต้องเปลี่ยนคีย์ในอุปกรณ์ทุกเครื่องที่คุณมี

หากคุณย้าย SSH ไปยังพอร์ตอื่นบน Ubuntu 24.04 โปรดทราบว่าตัวรับฟัง (listener) เป็นของ ssh.socket ดังนั้นการใช้บรรทัด Port เพียงอย่างเดียวจะไม่ส่งผลใดๆ ให้รัน sudo systemctl edit ssh.socket ล้างค่าเริ่มต้นด้วย ListenStream= ที่ว่างเปล่า จากนั้นจึงกำหนดพอร์ตของคุณในบรรทัดถัดไป การเพิ่มความปลอดภัย SSH บน VPS ครอบคลุมเรื่องดังกล่าวและส่วนอื่นๆ ของพื้นผิวการโจมตี

fail2ban สำหรับ SSH ช่วยเพิ่มความปลอดภัยได้เพียงเล็กน้อยเมื่อปิดการใช้รหัสผ่านแล้ว เนื่องจากรหัสผ่านที่ถูกเดาจะไม่สามารถยอมรับได้เลย สิ่งที่เพิ่มเข้ามาคือบันทึก (logs) ที่สะอาดตา ซึ่งช่วยให้สังเกตความพยายามในการล็อกอินจริงได้ง่ายขึ้น

ทางเลือกที่แข็งแกร่งกว่าคือการเก็บ SSH ไว้ไม่ให้เข้าถึงได้จากอินเทอร์เน็ตสาธารณะ ให้วางเซิร์ฟเวอร์ไว้หลัง WireGuard VPN ที่คุณโฮสต์เอง เปิดใช้งานทันเนลบนโทรศัพท์เมื่อต้องการ และกำหนดให้ sshd ใช้ ListenAddress เฉพาะบนทันเนลเท่านั้น mosh สามารถทำงานผ่านทันเนลได้เนื่องจากทั้งสองฝั่งใช้โปรโตคอล UDP ข้อควรระวังประการหนึ่งคือ ทันเนลจะเพิ่ม overhead ให้กับแพ็กเก็ต ดังนั้นหากการถ่ายโอนข้อมูลขนาดใหญ่หยุดชะงัก ให้ลดค่า MTU (maximum transmission unit) ในคอนฟิก WireGuard ของโทรศัพท์

ประเด็นสุดท้ายเกี่ยวกับการทำงานในลักษณะนี้ จากโทรศัพท์คุณจะต้องอนุมัติคำขอสิทธิ์บนหน้าจอที่แสดงผล diff ทีละไม่กี่บรรทัด นั่นเป็นเหตุผลที่ควรคงมาตรการป้องกันไว้แทนที่จะปิดใช้งาน การรัน Claude Code อย่างปลอดภัยบน VPS ครอบคลุมถึงการจำกัดสิทธิ์ผู้ใช้และไดเรกทอรีที่ควรตั้งค่าไว้ก่อนที่ช่องทางหลักในการเข้าถึงของคุณจะเป็นหน้าจอสัมผัส

เมื่อคุณเชื่อมต่อกลับแล้วพบปัญหา

tmux attach การแสดงผล no server running on /tmp/tmux-1000/default หมายความว่าเซิร์ฟเวอร์ tmux ได้หยุดทำงานไปแล้ว ซึ่งมักเกิดจากการที่เครื่องรีบูต ให้ตรวจสอบด้วยคำสั่ง uptime การอัปเดตเคอร์เนลจาก การอัปเดตความปลอดภัยอัตโนมัติ จะทำให้เครื่องรีบูต และเมื่อเครื่องรีบูตแล้วจะไม่มีเซสชัน tmux หลงเหลืออยู่ ดังนั้นให้ถือว่าการทำงานของ Claude Code ใดๆ เป็นสิ่งที่สามารถเริ่มต้นใหม่ได้

can't find session: claude มีความแตกต่างออกไป เซิร์ฟเวอร์ tmux ยังคงทำงานอยู่แต่ไม่มีชื่อเซสชันนั้นปรากฏอยู่ ให้ใช้ tmux ls เพื่อดูว่ามีเซสชันใดที่ยังคงอยู่บ้าง

หากคุณเชื่อมต่อกลับมาแล้วพบเพียงพรอมต์เชลล์ธรรมดาในจุดที่เคยเป็น Claude Code แสดงว่ากระบวนการทำงานได้สิ้นสุดลงโดยที่เซสชันยังไม่ปิด ให้ตรวจสอบที่ dmesg -T | tail เพื่อหาบรรทัดที่คล้ายกับ Out of memory: Killed process 4821 (claude) ซึ่งเป็นสิ่งที่เกิดขึ้นกับเครื่องที่มีหน่วยความจำต่ำกว่า 4 GB ในระหว่างการแก้ไขไฟล์ขนาดใหญ่ หากไม่พบข้อความดังกล่าว แสดงว่า Claude Code ได้ปิดตัวลงเอง และประวัติการเลื่อนหน้าจอเหนือพรอมต์จะแสดงสาเหตุเอาไว้

หน้าต่างที่แสดงผลออกมามีขนาดเล็กและมีพื้นที่ว่างรอบๆ หมายความว่ามีไคลเอนต์สองเครื่องเชื่อมต่ออยู่ด้วยขนาดหน้าจอที่ต่างกัน เนื่องจาก tmux จะปรับขนาดหน้าต่างให้พอดีกับไคลเอนต์ที่เชื่อมต่ออยู่และมีขนาดเล็กที่สุด แล็ปท็อปของคุณอาจยังคงค้างเซสชันไว้ที่ความกว้าง 200 คอลัมน์ ในขณะที่โทรศัพท์ร้องขอขนาด 40 คอลัมน์ ให้ตัดการเชื่อมต่อไคลเอนต์อื่นออกในขณะที่คุณเชื่อมต่อด้วยคำสั่ง: tmux attach -d -t claude

FAQ

ฉันสามารถรัน Claude Code บนโทรศัพท์โดยตรงแทนการใช้ VPS ได้หรือไม่?

ไม่ได้ แพลตฟอร์มที่รองรับ ณ เดือนกรกฎาคม 2026 ได้แก่ macOS, Windows, Ubuntu 20.04 หรือใหม่กว่า, Debian 10 หรือใหม่กว่า และ Alpine 3.19 หรือใหม่กว่า โดยต้องมี RAM ขนาด 4 GB ขึ้นไป Android และ iOS ไม่ได้อยู่ในรายการดังกล่าว นอกจากนี้ โทรศัพท์จะเข้าสู่โหมดพักแอปพลิเคชันและเปลี่ยนที่อยู่เครือข่ายอยู่ตลอดเวลา ซึ่งเป็นสภาวะที่การทำงานของเอเจนต์ระยะยาวไม่สามารถรองรับได้ ให้รันบนเซิร์ฟเวอร์แล้วใช้โทรศัพท์เป็นหน้าจอแสดงผลแทน

เซสชันจะยังคงอยู่หรือไม่หากฉันปิดแอปหรือสัญญาณขาดหาย?

ใช่ โดยมีส่วนประกอบสองส่วนที่ทำหน้าที่นี้ tmux จะรักษาการทำงานของโพรเซสบนเซิร์ฟเวอร์ไว้ ทำให้ไม่มีสิ่งใดหยุดทำงานเมื่อการเชื่อมต่อสิ้นสุดลง mosh จะรักษาการเชื่อมต่อให้คงอยู่แม้มีการเปลี่ยนที่อยู่เครือข่าย ดังนั้นการสลับจาก wifi ไปเป็นข้อมูลมือถือจึงไม่จำเป็นต้องเชื่อมต่อใหม่ หากใช้ SSH ปกติโดยไม่มี tmux การเชื่อมต่อที่หลุดจะส่งสัญญาณ SIGHUP และทำให้ Claude Code หยุดทำงานกลางคัน

ทำไม mosh เชื่อมต่อได้แต่ไม่แสดงผลใดๆ?

การล็อกอินที่สำเร็จแต่ค้างอยู่ที่ Nothing received from server on UDP port 60001. หมายความว่าพอร์ต UDP ช่วง 60000 ถึง 61000 ยังไม่ได้เปิดใช้งาน ให้เพิ่มช่วงพอร์ตดังกล่าวใน ufw และเพิ่มในไฟร์วอลล์เครือข่ายของผู้ให้บริการของคุณอีกครั้ง ซึ่งเป็นการตั้งค่าแยกต่างหากในแผงควบคุมส่วนใหญ่ หาก mosh รายงานว่าไม่พบ mosh-server แสดงว่าเซิร์ฟเวอร์ยังไม่ได้ติดตั้งแพ็กเกจ: sudo apt install mosh

ฉันจะขัดจังหวะ Claude Code จากคีย์บอร์ดที่ไม่มีปุ่ม Esc ได้อย่างไร?

ให้เพิ่มแถวปุ่มกด Termux สามารถกำหนดค่าได้ด้วย extra-keys ใน ~/.termux/termux.properties ส่วน Termius และ Blink มีแถวปุ่มที่สามารถแก้ไขได้ในการตั้งค่า Esc จะขัดจังหวะการตอบสนองที่กำลังทำงานอยู่และเก็บงานที่ทำเสร็จแล้วไว้ Ctrl+C สามารถขัดจังหวะได้เช่นกัน แต่หากกดสองครั้งในขณะที่พร้อมท์ว่างอยู่จะเป็นการออกจาก Claude Code ดังนั้นควรใช้ Esc ก่อน

การเปิด SSH สู่สาธารณะปลอดภัยเพียงพอสำหรับวิธีนี้หรือไม่?

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