SSD Nodes Learn Hosting plans →
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-10-30

آموزش اجرای Claude Code روی گوشی با استفاده از SSH و tmux

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

اجرای Claude Code از طریق گوشی: نحوه عملکرد واقعی

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

Claude Code قابلیت Remote Control را نیز ارائه می‌دهد: با اجرای /remote-control درون یک session، می‌توانید از طریق اپلیکیشن موبایل Claude یا یک مرورگر از آن استفاده کنید، در حالی که پردازش همچنان روی سرور باقی می‌ماند.

این جداسازی، کل طراحی سیستم است. سیستم‌عامل گوشی، اپلیکیشن را چند ثانیه پس از خروج از آن به حالت تعلیق درمی‌آورد، بنابراین هر کار طولانی که روی گوشی شروع شود، متوقف می‌گردد. همچنین، هر بار که از Wi-Fi به دیتای موبایل سوئیچ می‌کنید، آدرس شبکه تغییر می‌کند. با اجرای پردازش روی سرور و استفاده از گوشی صرفاً برای نمایش صفحه، هر دو مشکل برطرف می‌شوند.

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

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

یک سرور کوچک با Ubuntu 24.04 برای بخش‌های SSH و tmux کافی است. Claude Code منابع بیشتری می‌طلبد. الزامات رسمی تا اکتبر 2026 عبارتند از Ubuntu 20.04 یا جدیدتر روی پردازنده x64 یا ARM64، به همراه 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

با استفاده از 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 یک فرایند سرور مستقل اجرا می‌کند و shell شما و Claude Code فرزندان آن سرور هستند، نه فرزندان sshd. هنگامی که اتصال SSH قطع می‌شود، هسته سیستم‌عامل سیگنال hangup یا همان SIGHUP را برای فرایندهای متصل به آن اتصال ارسال می‌کند، اما سرور 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 ساده، اتصال را می‌بندد. هر زمان که به یک پوسته معمولی نیاز داشتید، از این فایل صرف‌نظر کنید: ssh you@server -t "bash --noprofile".

این کد را در ~/.profile قرار دهید و نه در ~/.bashrc. پوسته Bash فایل ~/.bashrc را نیز برای دستورات غیرتعاملی SSH می‌خواند، اما محافظ [ -t 1 ] در بالا از اجرای tmux در حین انتقال فایل جلوگیری می‌کند. دستورات راه‌اندازی بدون محافظ که خروجی چاپ می‌کنند، پروتکل‌های انتقال را با خطاهایی مانند Received message too long مختل می‌کنند. فایل ~/.profile فقط برای پوسته‌های ورود اجرا می‌شود که ماهیت یک نشست تعاملی SSH است.

فایل ~/.profile همان جایی است که اوبونتو ~/.local/bin را به PATH اضافه می‌کند. اگر claude بلافاصله پس از ورود به درستی کار می‌کند اما پوسته داخل tmux خطای command not found را می‌دهد، دلیل آن همین ترتیب اجراست؛ بنابراین tmux را به جای اسکریپتی که از profile صرف‌نظر می‌کند، از یک پوسته ورود مطابق بالا اجرا کنید.

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

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

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

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

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

اندروید: 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 متصل شوید.

صفحه‌کلید مجازی اندروید فاقد کلیدهای 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 را اجرا کنید تا ردیف کلیدها بالای صفحه‌کلید ظاهر شود. همین دستور reload، فونت TrueType با عرض ثابت (monospace) که در مسیر ~/.termux/font.ttf قرار داده‌اید را نیز بارگذاری می‌کند.

ممکن است اندروید در زمان فعالیت Termux در پس‌زمینه، آن را متوقف کند؛ در این سناریو، این اتفاق تنها منجر به قطع اتصال می‌شود و هیچ داده‌ای از دست نمی‌رود. نشست (session) و عامل (agent) روی سرور باقی می‌مانند.

چرا هنگام قطع وای‌فای ترمینال فریز می‌شود و mosh چه چیزی را اصلاح می‌کند؟

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

mosh (پوسته موبایل) این حالت شکست را حذف می‌کند. این ابزار یک بار از SSH برای ورود و شروع یک پردازش mosh-server استفاده می‌کند، پورت UDP (پروتکل دیتاگرام کاربر) انتخاب‌شده توسط سرور را می‌خواند و اتصال SSH را می‌بندد. پس از آن، دو طرف دیتاگرام‌های UDP را که با یک کلید نشست مشترک احراز هویت شده‌اند، مبادله می‌کنند؛ بنابراین نشست با آن کلید شناسایی می‌شود و نه با آدرس شما. آدرس جدید به‌سادگی به کار خود ادامه می‌دهد. mosh همچنین تایپ شما را به‌صورت محلی نمایش می‌دهد (echo) و در صورت عدم تطابق با سرور، صفحه را بازنویسی می‌کند؛ به همین دلیل است که روی لینک‌های موبایل کند نیز قابل‌استفاده باقی می‌ماند.

mosh از یک پورت UDP بین 60000 و 61000 استفاده می‌کند، بنابراین این محدوده را باز کنید:

sudo ufw allow 60000:61000/udp
sudo ufw status

باز کردن پورت‌ها با ufw بقیه تصویر فایروال را نشان می‌دهد. اگر ارائه‌دهنده شما یک فایروال شبکه جداگانه در پنل کنترل خود ارائه می‌دهد، همان محدوده را در آنجا نیز اضافه کنید، زیرا یک قانون ufw نمی‌تواند بر فیلتری که پیش از ماشین قرار دارد تأثیر بگذارد.

دو شکست رایج در mosh وجود دارد. ورودی که موفقیت‌آمیز است اما سپس هنگ می‌کند و Nothing received from server on UDP port 60001. را نشان می‌دهد، به این معنی است که mosh-server شروع شده اما کلاینت نمی‌تواند در آن پورت UDP به آن دسترسی پیدا کند. این معمولاً به این معنی است که فایروالی در جایی بین گوشی و سرور، ترافیک UDP را در محدوده mosh مسدود می‌کند. اتصالی که گزارش می‌دهد mosh-server یافت نشد، به این معنی است که بسته در سرور موجود نیست یا در PATH ورود وجود ندارد. آن را نصب کنید یا مستقیماً با mosh --server=/usr/bin/mosh-server you@server به آن اشاره کنید.

اگر لوکال ورود سرور UTF-8 نباشد، mosh-server تنظیمات لوکال ارائه‌شده توسط کلاینت را امتحان کرده و دوباره بررسی می‌کند. تنها در صورتی از اجرا خودداری می‌کند که آن هم نتواند UTF-8 ارائه دهد و mosh-server needs a UTF-8 native locale to run. را گزارش می‌کند. ابتدا لوکال را در سرور اصلاح کنید.

locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

هر دو طرف به یک لوکال UTF-8 نیاز دارند و mosh-server نیز تنظیمات لوکالی که کلاینت می‌فرستد را اعمال می‌کند. اگر خطا پس از اصلاح سرور باقی ماند، LANG را در اپلیکیشن ترمینال گوشی نیز روی یک مقدار UTF-8 تنظیم کنید، که طبق FAQ خود mosh، ممکن است mosh-client به آن نیاز داشته باشد.

دو کاری که 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 و سپس [ وارد حالت کپی می‌شود، با کشیدن یا کلیدهای جهت‌نما می‌توانید اسکرول کنید و 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 کشیدن انگشت (touch drag) را به اسکرول و ضربه زدن (tap) را به انتخاب پنل یا پنجره تبدیل می‌کند؛ این کار جایگزین اکثر کلیدهای پیشوندی (prefix keys) می‌شود که تایپ آن‌ها دشوار است. status-position top خط وضعیت tmux را از لبه پایینی صفحه دور می‌کند، جایی که کیبورد مجازی و نوار پیشنهادات آن را می‌پوشانند. default-terminal نام ترمینالی که tmux به Claude Code اعلام می‌کند را ثابت نگه می‌دارد. بدون این خط، tmux هر نامی را که در زمان build انتخاب شده باشد، اعلام می‌کند. اسکریپت پیکربندی tmux 3.4 از screen شروع می‌شود، سپس screen-256color، tmux و tmux-256color را به ترتیب تست می‌کند و در صورت شکست تست، مقدار قبلی حفظ می‌شود. بنابراین، buildای که نتواند ورودی terminfo مربوط به tmux-256color را پیدا کند، در نهایت با tmux، screen-256color یا حالت ساده screen مواجه می‌شود که ممکن است باعث نمایش نامناسب رنگ‌ها و خطوط کادر شود.

چهار کلید را یاد بگیرید تا بقیه کار راحت شود.

  • Esc پاسخ Claude را در میانه راه متوقف می‌کند و کارهای انجام‌شده را حفظ می‌کند؛ بنابراین این کلیدی است که باید نزدیک‌ترین دسترسی را به انگشت شست شما داشته باشد.
  • Ctrl+C نیز عملیات در حال اجرا را متوقف می‌کند. در حالت آماده‌به‌کار (idle prompt)، اولین فشار، ورودی را پاک می‌کند و فشار دوم از Claude Code خارج می‌شود؛ بنابراین ابزار خشن‌تری است.
  • Esc با دو بار فشار دادن، پیش‌نویس prompt را پاک می‌کند و در یک prompt خالی، منوی بازگشت (rewind) را باز می‌کند.
  • برای یک prompt چندخطی، \ را تایپ کرده و سپس Enter بزنید. این روش در هر ترمینالی کار می‌کند. کلید ترکیبی Shift+Enter فقط در لیست کوتاهی از ترمینال‌های دسکتاپ به صورت بومی پشتیبانی می‌شود و کلاینت‌های موبایل جزو آن‌ها نیستند.

از تقسیم پنل‌ها (split panes) خودداری کنید. عرض گوشی در حالت عمودی حدود 40 ستون است، بنابراین تقسیم عمودی باعث می‌شود هر پنل 20 ستون داشته باشد و هر diff به شکلی نامنظم در هم می‌پیچد. به جای آن از پنجره‌های tmux استفاده کنید: Ctrl-b c یک پنجره جدید می‌سازد و Ctrl-b n به پنجره بعدی می‌رود. اگر پنجره دوم شامل یک نشست (session) مستقل Claude Code باشد، دو نشست می‌توانند مستقیماً کارها را به یکدیگر واگذار کنند؛ این کار بهتر از کپی کردن متن بین پنجره‌ها روی صفحه لمسی است. زمانی که نیاز دارید یک diff را به درستی بخوانید، گوشی را به حالت افقی بچرخانید.

میزان متنی که روی صفحه نمایش ظاهر می‌شود ارزش تنظیم دقیق را دارد، زیرا سبک خروجی، system prompt پشت هر پاسخ را ویرایش می‌کند و سبک کوتاه‌تر به معنای اسکرول کردن کمتر در گوشی است.

یک نشست طولانی روی صفحه کوچک، عمدتاً یک مسئله مدیریت context است، بنابراین مدیریت پنجره context در Claude Code موضوعی است که پیش از تلاش برای انجام یک روز کاری کامل از داخل قطار، ارزش مطالعه دارد.

امن‌سازی: فقط کلید، بدون رمز عبور

اکنون گوشی شما حاوی کلیدی است که به ماشینی دسترسی دارد که کد شما را ویرایش کرده و دستورات را اجرا می‌کند. احراز هویت با رمز عبور را غیرفعال کنید. استفاده از یک فایل drop-in امن‌تر از ویرایش مستقیم sshd_config است، زیرا sshd_config در اوبونتو شامل /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 فایل پیکربندی را تحلیل می‌کند و در صورت معتبر بودن، خروجی چاپ نمی‌کند. اگر از این مرحله صرف‌نظر کنید و یک غلط تایپی وجود داشته باشد، sshd هنگام بارگذاری مجدد با خطا مواجه می‌شود. نشست کاری خود را باز نگه دارید و پیش از بستن هر چیزی، از یک اتصال دوم تست بگیرید؛ زیرا یک کلید اشتباه اکنون منجر به Permission denied (publickey). می‌شود و با غیرفعال بودن رمز عبور، راه بازگشتی نخواهید داشت. در آن نقطه، تنها راه بازیابی، کنسول ارائه‌دهنده سرور شماست. اگر آن اتصال تست با خطا مواجه شد، با ssh -v دوباره متصل شوید و مشکل را در حالی که نشست اول هنوز باز است برطرف کنید، زیرا آن پیام خطا پنج خطای مجزا را پوشش می‌دهد و خروجی verbose به شما می‌گوید که با کدام‌یک از آن‌ها مواجه هستید.

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

اگر SSH را در اوبونتو 24.04 به پورت دیگری منتقل می‌کنید، توجه داشته باشید که listener متعلق به ssh.socket است. یک generator در systemd آن سوکت را از خط Port در پیکربندی SSH شما می‌سازد، بنابراین نیازی به override با ListenStream ندارید، اما راه‌اندازی مجدد ssh به تنهایی باعث می‌شود سرور همچنان روی پورت 22 گوش دهد. خط Port را در یک فایل drop-in قرار دهید، پورت جدید را در ufw مجاز کنید، سپس sudo systemctl daemon-reload و به دنبال آن sudo systemctl restart ssh.socket را اجرا کنید. سخت‌سازی SSH روی یک VPS این مورد و سایر سطوح امنیتی را پوشش می‌دهد.

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

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

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

هنگام اتصال مجدد اگر مشکلی وجود دارد

tmux attach چاپ کردن no server running on /tmp/tmux-1000/default به این معنی است که tmux هیچ سروری را روی آن سوکت پیدا نکرده است. معمولاً سرور از بین رفته است که تقریباً همیشه به معنای راه‌اندازی مجدد (reboot) دستگاه است. با 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 نشان می‌دهد چه چیزی وجود دارد.

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

پنجره‌ای که با اندازه اشتباه بازمی‌گردد، از لبه بریده شده یا فضای خالی در اطراف آن دارد، به این معنی است که دو کلاینت با اندازه‌های متفاوت متصل هستند. به‌طور پیش‌فرض، tmux 3.4 اندازه پنجره را با کلاینتی که بیشترین فعالیت اخیر را داشته تنظیم می‌کند (window-size latest)، بنابراین لپ‌تاپ شما که همچنان با عرض 200 ستون متصل است و گوشی با عرض 40، به نوبت آن را تغییر اندازه می‌دهند. هنگام اتصال، دیگران را جدا کنید: tmux attach -d -t claude.

FAQ

آیا می‌توانم Claude Code را به‌جای VPS، مستقیماً روی گوشی اجرا کنم؟

رابط خط فرمان (CLI) در اندروید یا iOS پشتیبانی نمی‌شود. پلتفرم‌های پشتیبانی‌شده تا اکتبر 2026 عبارتند از macOS، Windows، Ubuntu 20.04 یا جدیدتر، Debian 10 یا جدیدتر، و Alpine 3.19 یا جدیدتر، با حداقل 4 گیگابایت رم. اندروید و iOS در این لیست نیستند. همچنین، گوشی‌ها برنامه‌ها را به حالت خواب (sleep) می‌برند و آدرس شبکه را به‌طور مداوم تغییر می‌دهند؛ شرایطی که اجرای طولانی‌مدت یک agent نمی‌تواند آن را تحمل کند. آن را روی یک سرور اجرا کنید و از گوشی فقط به‌عنوان نمایشگر استفاده کنید.

اگر برنامه را ببندم یا سیگنال قطع شود، نشست (session) باقی می‌ماند؟

بله، دو ابزار مجزا این کار را انجام می‌دهند. tmux پردازش را روی سرور فعال نگه می‌دارد، بنابراین با قطع اتصال، چیزی متوقف نمی‌شود. mosh اتصال را هنگام تغییر آدرس شبکه زنده نگه می‌دارد، بنابراین جابه‌جایی از وای‌فای به دیتای موبایل حتی نیاز به اتصال مجدد ندارد. با SSH معمولی و بدون tmux، قطع اتصال باعث ارسال SIGHUP شده و Claude Code در میانه کار متوقف می‌شود.

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

ورود موفقی که پس از آن با Nothing received from server on UDP port 60001. متوقف می‌شود، به این معنی است که کلاینت نمی‌تواند به mosh-server روی آن پورت UDP دسترسی پیدا کند؛ این معمولاً یعنی یک فایروال پورت‌های UDP 60000 تا 61000 را مسدود کرده است. این بازه را در ufw اضافه کنید و دوباره در فایروال شبکه ارائه‌دهنده خود (که در اکثر پنل‌ها یک کنترل جداگانه است) نیز اعمال کنید. اگر mosh گزارش می‌دهد که mosh-server یافت نشد، یعنی سرور فاقد این بسته است یا مسیر ورود 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 نیز متوقف می‌کند، اما فشردن آن برای دو بار در زمان آماده‌باش (idle prompt)، باعث خروج از Claude Code می‌شود، بنابراین ابتدا از Esc استفاده کنید.

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

با غیرفعال کردن احراز هویت رمز عبور، تنها اعتبارنامه‌ای که می‌تواند موفق باشد، کلیدی است که هرگز دستگاه شما را ترک نمی‌کند؛ این ریسکی منطقی برای ماشینی است که می‌توانید دوباره آن را بازسازی کنید. برای هر دستگاه کلید اختصاصی خود را بسازید تا در صورت گم شدن گوشی، فقط نیاز به حذف یک خط در authorized_keys باشد. اگر ترجیح می‌دهید اصلاً روی پورت عمومی پاسخ ندهید، سرور را پشت WireGuard قرار دهید و اجازه دهید sshd فقط روی آدرس تونل گوش دهد.

آیا این مقاله مفید بود؟