scp روی SFTP: نوشتن مسیرهای راه دوری که واقعاً حل میشوند
scp مدرن از طریق SFTP انتقال میدهد، بنابراین بازشدن تلدا و نویسههای عام رفتار متفاوتی دارند. مسیرهای صریح سرور را بنویسید و پروتکل را آگاهانه انتخاب کنید.
دستور scp که سالها در یک اسکریپت کار میکرد میتواند روی یک کلاینت فعلی با خطای مسیری شکست بخورد که هیچ ربطی به تونل ندارد. VPN بایتها را منتقل کرد؛ کلاینت از سرور نامی خواست که سرور نتوانست حل کند. scp فعلی OpenSSH بهطور پیشفرض از طریق SFTP انتقال میدهد، و SFTP بازشدن به سبک پوسته را مانند پروتکل قدیمی انجام نمیدهد. دنبال کردن دستور از حساب خودتان به سمت بیرون نشان میدهد مسیر واقعاً کجا تفسیر میشود.
از حساب شروع کنید، سپس از دایرکتوریای که میتواند در آن بنویسد
دونقطه دو فضای نام را جدا میکند و فقط سمت چپ به ماشینی تعلق دارد که روی آن تایپ میکنید. هر چیزی پس از آن را سرور حل میکند، زیر حسابی که با آن احراز هویت کردهاید، درون هر نمای فایلسیستمی که آن حساب دارد. پیش از ساختن دستور هر دو را تأیید کنید، چون مسیری که برای مدیر درست است بهطور خودکار برای کاربر انتقال درست نیست. همین تفاوت منبع بیشتر خطاهای مجوز است که شبیه خرابی شبکه به نظر میرسند.
از سرور نمای خودش را بخواهید: ssh [email protected] pwd و ssh [email protected] ls -ld /srv/archive. اگر دستور دوم مجوز رد شده را گزارش کند، تونل سالم است و مسیر برای آن حساب غیرقابل استفاده است. مالکیت را اصلاح کنید یا مقصد دیگری برگزینید، بهجای گسترش مجوزها تا انتقال بتواند ادامه یابد.
پیکربندی محدود SFTP میتواند یک chroot را بهعنوان ریشه فایلسیستم نمایش دهد. درون آن نما، مسیر مطلق درون chroot مطلق است، که همان مکانی نیست که مدیر روی میزبان میبیند.
هر دو سوی دونقطه را صریح نام ببرید
بارگذاری باید نام فایل راه دور را ذکر کند، نه اینکه فرض کند نام پایه محلی در آن سوی دیگر پذیرفتنی خواهد بود.
scp q3-invoice.csv [email protected]:/home/transfer/drop/q3-invoice.csvبارگیری باید مقصد محلی را دقیقاً به همین دلیل ذکر کند. دو فضای نام مستقلاند، و اسکریپتی که فرض میکند مطابقت دارند اولین بار که درخت راه دور چیدمان دیگری به کار میبرد میشکند.
scp [email protected]:/srv/archive/2026-q3.csv ./2026-q3.csvاز ~otheruser در اسکریپتی که نگهداری میشود پرهیز کنید. بازکردن پوشه خانه حساب دیگر ویژگی پوسته راه دور بود، و سرور SFTP ممکن است افزونهای که آن را شبیهسازی میکند پیاده نکرده باشد. مسیر مطلقی را بنویسید که حساب واقعاً میتواند باز کند، و مسیرهای محلی دارای فاصله را در گیومه بگذارید، بهجای کپی کردن لایههای گیومهای که برای پوستهای روی سرور نوشته شدهاند.
بدانید scp شما واقعاً از کدام پروتکل استفاده میکند
از OpenSSH 9.0 کلاینت بهطور پیشفرض از SFTP استفاده میکند، و توزیعها این رفتار را طبق برنامه خود میپذیرند یا به عقب منتقل میکنند. رشته نسخه میگوید کلاینت چه قصدی دارد، اما ساخت فروشنده میتواند با upstream تفاوت داشته باشد، پس کلاینتی را که واقعاً اجرا میکنید بررسی کنید: ssh -V.
دو پروتکل نامها را متفاوت حل میکنند. SCP قدیمی از پوسته کاربر راه دور میخواهد مسیر را باز کند، بنابراین نویسههای عام و تلداها را همان پوسته با قواعد خودش مدیریت میکند. SFTP در عوض عملیات انتقال فایل صادر میکند، بنابراین نویسه عام یا توسط کلاینت باز میشود یا اصلاً باز نمیشود. هر دو درون SSH به همان ماشین میروند، و به همین دلیل یک میزبان زیر دو کلاینت میتواند متفاوت رفتار کند.
scp -v زیرسیستمی را که درخواست میکند چاپ میکند، و خط زیرسیستم sftp تأیید میکند که مسیر مدرن به کار میرود. scp -O پروتکل قدیمی را جایی که پشتیبانی میشود و واقعاً لازم است اعمال میکند، و قواعد گیومه خودش را با خود برمیگرداند. این یک گزینه VPN نیست، راهی برای فعال کردن چیزی روی سرور نیست، و دلیلی برای سست کردن بررسی کلید میزبان نیست.
مسیر را پیش از آنکه اسکریپت به آن وابسته شود آزمایش کنید
مشکل مسیر در بدترین زمان ممکن، در کاری خودکار در شب که کسی نگاه نمیکند، آشکار میشود. ابتدا مقصد را با یک فایل کوچک و همان حساب دقیقی که کار استفاده میکند اثبات کنید، و آن دستور آزمایش را کنار تعریف کار نگه دارید. اگر آزمایش به حساب دیگری یا دایرکتوری دیگری نیاز داشته باشد، کار هم به آن نیاز خواهد داشت.
سمت سرور را هم بررسی کنید. grep -i subsystem /etc/ssh/sshd_config نشان میدهد آیا زیرسیستم SFTP پیکربندی شده است، و sftp -b /dev/null [email protected] تنها زمانی با موفقیت خارج میشود که آن زیرسیستم پاسخ دهد. میزبانی که ورودهای SSH را میپذیرد اما زیرسیستم ندارد در هر انتقال مدرن شکست میخورد، در حالی که در آزمایش ورود کاملاً سالم به نظر میرسد.
نسخه کلاینت، پروتکل در حال استفاده و مسیر مطلق راه دور را در یادداشتهای کار ثبت کنید. وقتی بهروزرسانی بعدی یک پیشفرض را تغییر دهد، همان یادداشت تفاوت بین اصلاحی پنجدقیقهای و یک بعدازظهر حدس زدن است.