SSD Nodes Learn Hosting plans →
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-27

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

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

การใช้งาน Claude Code จากโทรศัพท์: หลักการทำงานจริง

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

การแยกส่วนนี้คือหัวใจสำคัญของการออกแบบ ระบบปฏิบัติการบนโทรศัพท์จะระงับการทำงานของแอปหลังจากที่คุณสลับหน้าจอออกไปเพียงไม่กี่วินาที ดังนั้นงานระยะยาวใดๆ ที่เริ่มบนโทรศัพท์จะหยุดทำงานทันที นอกจากนี้โทรศัพท์ยังได้รับที่อยู่เครือข่ายใหม่ทุกครั้งที่คุณสลับจาก 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 ขึ้นไป หากใช้แพ็กเกจขนาด 1 GB จะติดตั้งได้สำเร็จแต่กระบวนการจะถูก kernel สั่งยุติการทำงานเมื่อมีโหลด นอกจากนี้ Claude Code ยังต้องการบัญชี Claude แบบชำระเงิน (Pro, Max, Team หรือ Enterprise) หรือบัญชี Console ที่เข้าถึง API ได้ เนื่องจากแผนการใช้งานฟรีของ Claude.ai ไม่รวมบริการนี้

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

sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --version

ตัวติดตั้งจะวางไฟล์ binary ไว้ที่ ~/.local/bin/claude และ claude --version จะแสดงผลลัพธ์บรรทัดที่คล้ายกับ 2.1.211 (Claude Code) หากแสดงผลเป็น command not found แสดงว่าไดเรกทอรีดังกล่าวยังไม่อยู่ใน PATH ของคุณ ให้ทำการ log out แล้ว log in ใหม่ จากนั้นตรวจสอบด้วย command -v claude ส่วน claude doctor จะแสดงข้อมูลการวินิจฉัยการติดตั้งและการตั้งค่าโดยไม่ต้องเริ่มเซสชัน

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

เริ่มใช้งาน 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 claude

tmux 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
fi

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

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

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

แอปทั้งสองรองรับ 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.pub

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

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

sudo ufw allow 60000:61000/udp
sudo ufw status

การเปิดพอร์ตด้วย ufw มีรายละเอียดเพิ่มเติมเกี่ยวกับ firewall หากผู้ให้บริการของคุณมี network firewall แยกต่างหากในแผงควบคุม คุณต้องเพิ่มช่วงพอร์ตเดียวกันนั้นเข้าไปด้วย เนื่องจากกฎของ 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 แบบไม่โต้ตอบ (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 20000

mouse on เปลี่ยนการลากนิ้วบนหน้าจอให้เป็นการเลื่อน และเปลี่ยนการแตะให้เป็นการเลือกบานหน้าต่างหรือหน้าต่าง ซึ่งช่วยแทนที่ปุ่ม prefix ส่วนใหญ่ที่พิมพ์ได้ยาก status-position top ย้ายบรรทัดสถานะของ tmux ออกจากขอบด้านล่าง ซึ่งเป็นตำแหน่งที่คีย์บอร์ดบนหน้าจอและแถบคำแนะนำมักจะบังอยู่ default-terminal มีความสำคัญเนื่องจากหากไม่มีการตั้งค่านี้ tmux จะแจ้งสถานะเทอร์มินัลเป็น screen ให้กับ Claude Code ส่งผลให้การแสดงสีและการวาดกล่องทำได้ไม่ดีเท่าที่ควร หาก tmux ปฏิเสธที่จะเริ่มทำงานด้วยข้อผิดพลาด missing or unsuitable terminal: tmux-256color แสดงว่ารายการ terminfo หายไป ให้ใช้คำสั่ง sudo apt install ncurses-term

เรียนรู้ปุ่มเพียงสี่ปุ่มแล้วการใช้งานจะสะดวกสบายขึ้น:

  • Esc ใช้ขัดจังหวะ Claude ในระหว่างการตอบกลับโดยที่ยังคงงานที่ทำเสร็จแล้วไว้ จึงเป็นปุ่มที่คุณควรวางไว้ใกล้กับนิ้วโป้งมากที่สุด
  • Ctrl+C ใช้ขัดจังหวะการทำงานที่กำลังดำเนินอยู่เช่นกัน ในขณะที่ prompt ว่างอยู่ การกดครั้งแรกจะเป็นการล้างข้อมูลที่ป้อนไว้ และการกดครั้งที่สองจะเป็นการออกจาก Claude Code จึงถือเป็นเครื่องมือที่รุนแรงกว่า
  • Esc กดสองครั้งเพื่อล้างร่าง prompt และหาก prompt ว่างอยู่จะเป็นการเปิดเมนู rewind แทน
  • สำหรับ prompt แบบหลายบรรทัด ให้พิมพ์ \ แล้วตามด้วย Enter รูปแบบนี้ใช้งานได้ในทุกเทอร์มินัล ส่วน Shift+Enter จะใช้งานได้เฉพาะในเทอร์มินัลบนเดสก์ท็อปบางรายการเท่านั้น ซึ่งไคลเอนต์บนมือถือไม่รองรับ

หลีกเลี่ยงการแบ่งบานหน้าต่าง (split panes) โทรศัพท์ในแนวตั้งมีความกว้างประมาณ 40 คอลัมน์ ดังนั้นการแบ่งแนวตั้งจะเหลือพื้นที่เพียง 20 คอลัมน์ต่อบานหน้าต่าง ซึ่งจะทำให้ diff ทุกรายการแสดงผลซ้อนทับกันจนอ่านไม่รู้เรื่อง ให้ใช้หน้าต่าง tmux แทน โดย Ctrl-b c ใช้สร้างหน้าต่างใหม่ และ Ctrl-b n ใช้สลับไปยังหน้าต่างถัดไป หากหน้าต่างที่สองมีเซสชัน Claude Code ของตัวเอง ทั้งสองเซสชันสามารถส่งต่องานให้กันได้โดยตรง แทนที่คุณจะต้องคัดลอกข้อความระหว่างหน้าต่างบนหน้าจอสัมผัส ให้หมุนโทรศัพท์เป็นแนวนอนเมื่อต้องการอ่าน diff อย่างละเอียด

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

เซสชันที่ยาวนานบนหน้าจอขนาดเล็กมักเป็นปัญหาเรื่องบริบท ดังนั้น การจัดการหน้าต่างบริบทของ Claude Code จึงเป็นสิ่งที่ควรอ่านก่อนที่คุณจะพยายามทำงานเต็มวันจากบนรถไฟ

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

ขณะนี้โทรศัพท์ของคุณมีคีย์สำหรับเข้าถึงเครื่องที่ใช้แก้ไขโค้ดและรันคำสั่งแล้ว ให้ปิดการยืนยันตัวตนด้วยรหัสผ่าน การใช้ไฟล์ 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 โปรดทราบว่าตัวรับฟังเป็นของ ssh.socket ดังนั้นการใช้บรรทัด Port เพียงอย่างเดียวจะไม่ส่งผลใดๆ ให้รัน sudo systemctl edit ssh.socket, ล้างค่าเริ่มต้นด้วยการใช้ ListenStream= ว่างเปล่า จากนั้นจึงกำหนดพอร์ตของคุณในบรรทัดถัดไป การเพิ่มความปลอดภัยให้ SSH บน VPS ครอบคลุมเรื่องนี้และส่วนอื่นๆ ที่เหลือ

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

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

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

When you reattach and something is wrong

tmux attach printing no server running on /tmp/tmux-1000/default means the tmux server is gone, which nearly always means the machine rebooted. Check with uptime. Kernel updates from automatic security updates reboot the box, and a rebooted box has no tmux session, so treat any Claude Code run as something you can restart.

can't find session: claude is different. The tmux server is running but that name is not there. tmux ls shows what does exist.

If you attach and find a plain shell prompt where Claude Code used to be, the process ended without the session ending. Look at dmesg -T | tail for a line like Out of memory: Killed process 4821 (claude), which is what a box below the 4 GB requirement does during a large edit. No such line means Claude Code exited on its own, and the shell's scrollback above the prompt holds the reason.

A window that comes back tiny, with unused space around it, means two clients are attached at different sizes, because tmux sizes a window to fit the smallest attached client. Your laptop is still holding the session at 200 columns wide while the phone asks for 40. Detach the others as you attach: 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 จะรักษาการเชื่อมต่อให้คงอยู่แม้มีการเปลี่ยนที่อยู่เครือข่าย ดังนั้นการสลับจาก Wi-Fi ไปเป็นข้อมูลมือถือจะไม่ทำให้คุณต้องเชื่อมต่อใหม่ หากใช้ 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 ได้อย่างไร?

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

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

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