SSD Nodes Learn 8GB RAM — سالی $66
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-08-01

اجرای Claude Code با تلفن و VPS

Claude Code روی VPS و داخل tmux اجرا می‌شود، نه تلفن. راهنمای تنظیم کلید SSH، mosh برای اینترنت ناپایدار، اتصال مجدد tmux و اصلاحات صفحه‌کلید.

Claude Code از تلفن همراه: سازوکار واقعی آن

Claude Code از تلفن همراه یک اپلیکیشن موبایل نیست. Claude Code روی یک VPS (سرور خصوصی مجازی) و داخل یک نشست tmux اجرا می‌شود که باز می‌ماند. تلفن همراه شما تا زمانی که آن نشست را مشاهده می‌کنید، یک اتصال SSH (پوسته امن) به آن برقرار می‌کند. اگر اپلیکیشن را ببندید، agent همچنان به کار خود ادامه می‌دهد، زیرا فرایند هرگز روی تلفن اجرا نشده است.

این جداسازی، اساس طراحی است. سیستم‌عامل تلفن همراه چند ثانیه پس از خروج از اپلیکیشن، آن را معلق می‌کند؛ بنابراین هر کار طولانی که روی تلفن شروع شده باشد، متوقف می‌شود. همچنین هر بار که از wifi به داده تلفن همراه منتقل می‌شوید، یک نشانی شبکه جدید دریافت می‌کنید. وقتی فرایند روی سرور اجرا شود و تلفن فقط صفحه را نمایش دهد، هر دو مشکل برطرف می‌شوند.

در سرور به چهار مورد نیاز دارید: tmux برای نگه‌داشتن نشست، کلیدهای SSH برای ورود، mosh برای تغییرات شبکه، و خود Claude Code. در سمت تلفن نیز فقط به یک اپلیکیشن ترمینال با ردیف کلیدهای قابل‌دسترسی نیاز دارید.

آنچه روی VPS نیاز دارید

یک سرور کوچک Ubuntu 24.04 برای بخش‌های SSH و tmux کافی است. Claude Code به منابع بیشتری نیاز دارد. طبق الزامات رسمی در ژوئیه 2026، سیستم باید Ubuntu 20.04 یا جدیدتر را روی پردازنده x64 یا ARM64 اجرا کند و حداقل 4 GB RAM داشته باشد. یک پلن 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 چاپ شود، آن directory هنوز در PATH شما قرار ندارد: از سیستم خارج شوید، دوباره وارد شوید و سپس با command -v claude بررسی کنید. claude doctor گزارش‌های تشخیصی نصب و تنظیمات را بدون شروع session چاپ می‌کند.

اکنون، پیش از آنکه به تلفن وابسته شوید، یک بار از لپ‌تاپ وارد شوید. claude را در یک directory پروژه اجرا کنید و دستورهای login را دنبال کنید. این فرایند از شما می‌خواهد URL را در browser باز کنید و یک code را به terminal برگردانید؛ انجام هم‌زمان این کار با دو app روی صفحه تلفن کند است. این کار را یک بار با یک keyboard واقعی انجام دهید تا credentials روی سرور باقی بمانند.

اجرای Claude Code داخل tmux برای جلوگیری از توقف آن پس از قطع اتصال

tmux new -s claude
cd ~/projects/api
claude

با Ctrl-b از نشست جدا شوید و سپس d را اجرا کنید. tmux، [detached (from session claude)] را نمایش می‌دهد و کنترل shell را به شما بازمی‌گرداند. اکنون برنامه را ببندید، اتصال را از دست بدهید یا تلفن را در جیب خود بگذارید. پنجره همچنان اجرا می‌شود.

tmux ls
tmux attach -t claude

tmux ls برای هر نشست یک خط نمایش می‌دهد؛ برای مثال، claude: 1 windows (created Thu Jul 30 09:14:02 2026). tmux attach -t claude شما را دقیقاً به همان محل قبلی بازمی‌گرداند، از جمله ویرایش نیمه‌تمام.

این روش کار می‌کند، زیرا tmux فرایند server مستقل خود را اجرا می‌کند و shell و Claude Code فرزندان آن server هستند، نه فرزندان sshd. هنگامی که اتصال SSH پایان می‌یابد، kernel سیگنال قطع اتصال، یعنی SIGHUP، را برای فرایندهای متصل به آن اتصال ارسال می‌کند؛ اما tmux server در میان آن‌ها نیست. بدون tmux، همان قفل شدن صفحه که اتصال شما را قطع می‌کند، Claude Code را هنگام اجرای یک فراخوانی ابزار متوقف می‌کند. اجرای Claude Code روی VPS داخل tmux ساختار نشست را با جزئیات بیشتری توضیح می‌دهد.

tmux را روی server اجرا کنید، نه روی تلفن. وارد کردن tmux درون نشستی که از قبل به آن متصل هستید، sessions should be nested with care, unset $TMUX to force را نمایش می‌دهد و اجرای اجباری آن باعث می‌شود دو کلید پیشوند با یکدیگر تداخل داشته باشند.

در هر ورود به‌صورت خودکار متصل شوید

وارد کردن فرمان 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 را همان‌طور که در بالا توضیح داده شد، از یک پوسته ورود اجرا کنید، نه از اسکریپتی که profile را نادیده می‌گیرد.

هر دو برنامه از SSH و mosh پشتیبانی می‌کنند و کلیدها را در خود برنامه ذخیره می‌کنند. تفاوت آن‌ها در رابط کاربری است.

Blink Shell مبتنی بر فرمان است. در اعلان آن، ssh you@server یا mosh you@server را وارد می‌کنید؛ این همان نحوی است که در ترمینال دسکتاپ استفاده می‌شود. تنظیمات با وارد کردن config باز می‌شوند و بخش Keys یک جفت کلید برای شما ایجاد می‌کند.

Termius مبتنی بر فرم است. یک مدخل میزبان ایجاد می‌کنید، سپس در جزئیات میزبان، پروتکل آن را از SSH به Mosh تغییر می‌دهید. Termius پیاده‌سازی اختصاصی mosh را ارائه می‌کند و از mosh 1.3.0 و نسخه‌های جدیدتر پشتیبانی می‌کند؛ بنابراین همچنان باید بسته mosh روی سرور نصب باشد.

در هر دو حالت، کلید را داخل برنامه ایجاد کنید و هرگز یک کلید خصوصی موجود را روی تلفن کپی نکنید. برنامه بخش عمومی کلید را نمایش می‌دهد. این بخش همان خط منفردی است که باید به ~/.ssh/authorized_keys روی سرور اضافه کنید. کلیدهای SSH جداگانه برای هر دستگاه و نحوه لغو یک کلید نام‌گذاری و مرحله لغو را توضیح می‌دهد؛ این موضوع برای تلفن مهم‌تر از لپ‌تاپ است.

قفل بیومتریک یا قفل گذرواژه خود برنامه ترمینال را فعال کنید. در غیر این صورت، تلفن بازشده تا زمانی که صفحه روشن بماند، یک shell باز روی سرور شما خواهد بود.

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 همان رفتاری را دارند که در یک رایانه رومیزی دارند. خط کلید عمومی نمایش‌داده‌شده را در ~/.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 تک‌فاصله را که در ~/.termux/font.ttf قرار داده‌اید نیز شناسایی می‌کند.

Android ممکن است وقتی Termux در پس‌زمینه قرار دارد، آن را متوقف کند. در اینجا، نتیجه آن فقط اتصال مجدد است. نشست و agent روی سرور اجرا می‌شوند.

چرا هنگام خروج از محدوده wifi ترمینال متوقف می‌شود و mosh چه مشکلی را برطرف می‌کند؟

اتصال SSH یک اتصال TCP (transmission control protocol) است و اتصال TCP با هر دو نشانی و هر دو پورت شناسایی می‌شود. از محدوده wifi خارج شوید، تلفن از شبکه تلفن همراه یک نشانی جدید می‌گیرد؛ بنابراین اتصال قدیمی دیگر در هیچ‌یک از دو طرف مطابقت ندارد. هیچ پیامی این تغییر را اعلام نمی‌کند. ترمینال فقط تا زمانی که TCP تسلیم شود، دیگر پاسخ نمی‌دهد و سپس ssh پیام client_loop: send disconnect: Broken pipe را چاپ می‌کند. برای خاتمه فوری یک نشست متوقف‌شده، Enter، سپس ~ و بعد . را فشار دهید.

mosh (mobile shell) این حالت خرابی را حذف می‌کند. mosh یک بار از SSH برای ورود و آغاز فرایند mosh-server استفاده می‌کند، پورت UDP (user datagram protocol) انتخاب‌شده توسط سرور را می‌خواند و اتصال SSH را می‌بندد. پس از آن، دو طرف دیتاگرام‌های UDP را با یک کلید نشست مشترک احراز هویت‌شده مبادله می‌کنند؛ بنابراین نشست با آن کلید، نه با نشانی شما، شناسایی می‌شود. با تغییر نشانی، نشست ادامه پیدا می‌کند. 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، پشتیبانی نمی‌کند؛ بنابراین برای پیش‌نمایش یک web app که Claude Code به‌تازگی راه‌اندازی کرده است، همچنان به ssh -L 8080:127.0.0.1:8080 you@server معمولی نیاز دارید. mosh همچنین فقط صفحه قابل مشاهده را همگام‌سازی می‌کند و بنابراین scrollback مستقلی ندارد. این محدودیت دوم در اینجا مشکلی ایجاد نمی‌کند، زیرا tmux scrollback را نگه می‌دارد: Ctrl-b سپس [ وارد حالت کپی می‌شود؛ با کشیدن یا کلیدهای جهت‌نما پیمایش کنید و با 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 کشیدن انگشت را به پیمایش و ضربه‌زدن را به انتخاب پن یا پنجره تبدیل می‌کند. این قابلیت جایگزین بیشتر کلیدهای پیشوندی می‌شود که تایپ‌کردن آن‌ها دشوار است. 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 نیز یک عملیات در حال اجرا را متوقف می‌کند. در یک اعلان آماده و بدون فعالیت، نخستین فشار ورودی را پاک می‌کند و فشار دوم از Claude Code خارج می‌شود. بنابراین ابزار خشن‌تری است.
  • دوبار فشردن Esc پیش‌نویس اعلان را پاک می‌کند. در یک اعلان خالی، به‌جای آن منوی بازگردانی را باز می‌کند.
  • برای یک اعلان چندخطی، \ را تایپ کنید و سپس Enter را بزنید. این روش در هر ترمینالی کار می‌کند. Shift+Enter فقط در فهرست کوتاهی از ترمینال‌های دسکتاپ به‌صورت بومی پشتیبانی می‌شود و کلاینت‌های موبایل در این فهرست نیستند.

از پن‌های تقسیم‌شده استفاده نکنید. عرض تلفن در حالت عمودی حدود 40 ستون است، بنابراین یک تقسیم عمودی برای هر پن 20 ستون باقی می‌گذارد و هر diff به شکلی نامناسب به چند خط می‌شکند. به‌جای آن از پنجره‌های tmux استفاده کنید: Ctrl-b c یک پنجره ایجاد می‌کند و Ctrl-b n به پنجره بعدی می‌رود. وقتی لازم است یک diff را به‌درستی بخوانید، تلفن را افقی کنید.

یک نشست طولانی روی صفحه‌ای کوچک، بیشتر مسئله مدیریت context است. بنابراین مدیریت پنجره context در 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 نیاز دارد و لپ‌تاپ شما همچنان کار می‌کند. استفاده از یک کلید مشترک یعنی باید کلید را در همه دستگاه‌های خود تغییر دهید.

اگر در Ubuntu 24.04، SSH را به پورت دیگری منتقل می‌کنید، توجه کنید که شنونده به ssh.socket تعلق دارد؛ بنابراین، قرار دادن یک خط Port به‌تنهایی هیچ تغییری ایجاد نمی‌کند. sudo systemctl edit ssh.socket را اجرا کنید، مقدار پیش‌فرض را با یک ListenStream= خالی پاک کنید، سپس پورت خود را در خط بعدی تنظیم کنید. سخت‌سازی SSH روی یک VPS این موضوع و سایر بخش‌های سطح حمله را پوشش می‌دهد.

fail2ban برای SSH پس از غیرفعال کردن گذرواژه‌ها، امنیت چندانی اضافه نمی‌کند، زیرا گذرواژه حدس‌زده‌شده اصلاً پذیرفته نمی‌شود. مزیت آن، لاگ‌های کم‌سروصداتر است که شناسایی یک تلاش واقعی برای ورود را آسان‌تر می‌کند.

گزینه ایمن‌تر این است که SSH را از اینترنت عمومی خارج نگه دارید. سرور را پشت یک VPN از نوع WireGuard که خودتان میزبانی می‌کنید قرار دهید، تونل را در صورت نیاز روی تلفن فعال کنید و برای sshd یک ListenAddress فقط روی تونل تنظیم کنید. mosh از طریق تونل کار می‌کند، زیرا هر دو سمت از UDP استفاده می‌کنند. یک نکته مهم وجود دارد: تونل سربار بسته ایجاد می‌کند؛ بنابراین اگر انتقال‌های بزرگ متوقف شدند، MTU (حداکثر واحد انتقال) را در پیکربندی WireGuard تلفن کاهش دهید.

یک نکته نهایی درباره کار با این روش وجود دارد. در تلفن، درخواست‌های مجوز را روی صفحه‌ای تأیید می‌کنید که هر بار فقط چند خط از diff را نشان می‌دهد. این موضوع دلیلی برای حفظ حفاظ‌ها است، نه خاموش کردن آن‌ها. اجرای ایمن Claude Code روی یک VPS محدودیت‌های کاربر و دایرکتوری را که باید پیش از تبدیل صفحه لمسی به مسیر اصلی ورود تنظیم کنید، توضیح می‌دهد.

وقتی دوباره متصل می‌شوید و مشکلی وجود دارد

نمایش tmux attach در no server running on /tmp/tmux-1000/default به این معناست که سرور tmux از بین رفته است؛ این وضعیت تقریباً همیشه یعنی ماشین reboot شده است. با uptime بررسی کنید. به‌روزرسانی‌های kernel از به‌روزرسانی‌های امنیتی خودکار باعث reboot شدن سیستم می‌شوند. سیستم reboot‌شده هیچ نشست tmux ندارد. بنابراین اجرای Claude Code را چیزی در نظر بگیرید که می‌توانید دوباره راه‌اندازی کنید.

can't find session: claude متفاوت است. سرور tmux در حال اجراست، اما آن نام وجود ندارد. tmux ls مواردی را که وجود دارند نمایش می‌دهد.

اگر متصل شوید و به‌جای Claude Code یک prompt ساده shell ببینید، فرایند بدون پایان یافتن نشست خاتمه یافته است. در dmesg -T | tail به‌دنبال خطی مانند Out of memory: Killed process 4821 (claude) بگردید. این خط نشان می‌دهد سیستمی که کمتر از مقدار موردنیاز 4 GB حافظه دارد، هنگام ویرایش بزرگ چه وضعیتی پیدا می‌کند. اگر چنین خطی وجود نداشته باشد، Claude Code به‌تنهایی خارج شده است و scrollback مربوط به shell در بالای prompt، دلیل را نشان می‌دهد.

پنجره‌ای که با اندازه‌ای بسیار کوچک برمی‌گردد و فضای خالی زیادی اطراف آن دارد، نشان می‌دهد دو client با اندازه‌های متفاوت متصل هستند؛ زیرا tmux اندازه پنجره را بر اساس کوچک‌ترین client متصل تنظیم می‌کند. لپ‌تاپ شما هنوز نشست را با عرض 200 ستون نگه داشته است، درحالی‌که تلفن عرض 40 ستون را درخواست می‌کند. هنگام اتصال، clientهای دیگر را detach کنید: tmux attach -d -t claude.

FAQ

آیا می‌توانم Claude Code را به‌جای VPS مستقیماً روی خود تلفن اجرا کنم؟

خیر. پلتفرم‌های پشتیبانی‌شده تا July 2026 شامل macOS، Windows، Ubuntu 20.04 یا جدیدتر، Debian 10 یا جدیدتر، و Alpine 3.19 یا جدیدتر هستند و حداقل 4 GB RAM دارند. Android و iOS در این فهرست نیستند. تلفن همچنین برنامه‌ها را به حالت خواب می‌برد و نشانی شبکه را دائماً تغییر می‌دهد؛ اجرای طولانی agent نمی‌تواند این وضعیت را تحمل کند. آن را روی یک server اجرا کنید و از تلفن به‌عنوان نمایشگر استفاده کنید.

اگر برنامه را ببندم یا سیگنال را از دست بدهم، session باقی می‌ماند؟

بله، و 2 جزء جداگانه این کار را انجام می‌دهند. tmux فرایند را روی server در حال اجرا نگه می‌دارد؛ بنابراین با پایان اتصال، چیزی متوقف نمی‌شود. mosh خود اتصال را هنگام تغییر نشانی فعال نگه می‌دارد؛ بنابراین جابه‌جایی از wifi به mobile data حتی به reconnect هم نیاز ندارد. در SSH معمولی و بدون tmux، قطع اتصال SIGHUP ارسال می‌کند و Claude Code در میانه کار متوقف می‌شود.

چرا mosh متصل می‌شود و سپس چیزی نشان نمی‌دهد؟

اگر login موفق شود و سپس با Nothing received from server on UDP port 60001. متوقف شود، یعنی UDP 60000 تا 61000 باز نیست. این بازه را در ufw اضافه کنید و آن را دوباره در network firewall ارائه‌دهنده خود نیز اضافه کنید؛ این firewall در بیشتر پنل‌ها یک کنترل جداگانه است. اگر mosh در عوض گزارش کند که mosh-server پیدا نشد، package مربوطه روی server نصب نیست: sudo apt install mosh.

چگونه می‌توانم Claude Code را با صفحه‌کلیدی بدون کلید Esc متوقف کنم؟

یک ردیف کلید اضافه کنید. Termux با extra-keys در ~/.termux/termux.properties یک ردیف را پیکربندی می‌کند و Termius و Blink نیز هر دو ردیفی ارائه می‌کنند که می‌توانید در settings ویرایش کنید. Esc یک response در حال اجرا را متوقف می‌کند و کار انجام‌شده تا آن لحظه را حفظ می‌کند. Ctrl+C نیز فرایند را متوقف می‌کند، اما اگر آن را 2 بار در یک prompt بیکار فشار دهید، از Claude Code خارج می‌شود؛ بنابراین ابتدا از Esc استفاده کنید.

آیا باز کردن SSH به اینترنت برای این کار به‌اندازه کافی امن است؟

اگر password authentication خاموش باشد، تنها credential قابل‌قبول keyای است که هرگز دستگاه‌های شما را ترک نمی‌کند؛ این برای ماشینی که می‌توانید دوباره بسازید، ریسک معقولی است. برای هر دستگاه key جداگانه‌ای ایجاد کنید تا در صورت گم‌شدن تلفن، فقط یک خط در authorized_keys را حذف کنید. اگر ترجیح می‌دهید اصلاً به یک public port پاسخ ندهید، box را پشت WireGuard قرار دهید و بگذارید sshd روی نشانی tunnel به درخواست‌ها گوش دهد.