Tarkibga o'tish

scp va rsync

Bu modulda shu paytgacha ko'rilgan hamma narsa interaktiv login haqida edi — serverga ulanib, u yerda buyruqlar ishga tushirish. Lekin haqiqiy ma’muriy ishning katta qismi fayllarni ko'chirishdan iborat: konfiguratsiya faylini yuklash, tahlil uchun log faylini yuklab olish, zaxira arxivini boshqa serverga nusxalash. Bu maqola fayllarni xavfsiz ko'chirish uchun allaqachon mavjud SSH infratuzilmasi ustiga qurilgan ikkita vositani — scp va rsync ni ko'rib chiqadi.

scp: oddiy, to'g'ridan-to'g'ri nusxalash

scp (secure copy) — SSH ulanishi ustiga qurilgan, sintaksisi cp ga o'xshash vosita. Fayl joylashuvlari [user@]host:path ko'rinishida yoziladi.

Lokal mashinadan serverga:

scp app.conf [email protected]:/etc/myapp/app.conf

Serverdan lokal mashinaga:

scp [email protected]:/var/log/myapp/error.log ./error.log

Butun katalogni nusxalash uchun -r (rekursiv) flag'i kerak:

scp -r ./dist [email protected]:/var/www/myapp/

Boshqa foydali flag'lar:

  • -P <port> — sukut bo'yicha 22 dan boshqa port (e’tibor bering: scp katta -P dan, ssh esa kichik -p dan foydalanadi — ularni adashtirish keng tarqalgan xato);
  • -i <file> — muayyan private key faylidan foydalanish;
  • -p — fayl vaqt belgilari va ruxsatlarini saqlash.
scp -P 2222 -i ~/.ssh/id_ed25519 backup.tar.gz [email protected]:~/backups/

scp ning cheklovlari

scp oddiy, bir martalik uzatishlar uchun qulay, lekin uning bir nechta muhim cheklovi bor:

  • davom ettirishni qo'llab-quvvatlamaydi — ulanish uzilsa, fayl 99% yuklangan bo'lsa ham uzatishni boshidan boshlash kerak;
  • farqlarni bilmaydi — xuddi shu katalogni ikkinchi marta nusxalash har bir faylni, hatto o'zgarmaganlarini ham, to'liq qayta yuboradi;
  • sinxronlash emas, nusxalash — manbadan o'chirilgan fayl manzilda qolib ketadi.

Bu cheklovlar katta hajmdagi ma’lumotlar, takrorlanuvchi zaxira nusxalari yoki beqaror tarmoq bilan ishlaganda real muammoga aylanadi — rsync aynan shu vaziyatlar uchun yaratilgan.

Note

OpenSSH’ning yangi versiyalari scp ning ichki protokolini asta-sekin SFTP’ga o'tkazmoqda (eski SCP protokolining ma’lum xavfsizlik cheklovlari bor). Bu scp buyrug'ining tashqi sintaksisini sezilarli o'zgartirmaydi, lekin serverda SFTP quyi tizimi yoqilgan bo'lishini talab qiladi — standart OpenSSH o'rnatmasida bu allaqachon shunday.

rsync: farqni nusxalaydigan vosita

rsync manba va manzildagi fayllarni solishtiradi va faqat farqni (yoki hali umuman nusxalanmagan fayllarni) uzatadi. Bu ikki afzallik beradi: tarmoq trafigi kamroq bo'ladi va ulanish uzilib, buyruq qayta ishga tushirilganda allaqachon uzatilgan ma’lumotlar qayta yuborilmaydi.

Asosiy sintaksis cp/scp ga o'xshaydi, lekin manba katalogi oxiridagi / uning ma’nosini sezilarli o'zgartiradi:

rsync -avz ./dist/ [email protected]:/var/www/myapp/

Eng muhim flag'lar

  • -a (archive) — ruxsatlar, egalik, vaqt belgilari va symbolic link’larni saqlagan holda rekursiv nusxalash; deyarli har bir chaqiruvda ishlatiladigan asosiy flag;
  • -v — batafsil chiqish, qaysi fayllar uzatilayotganini ko'rsatadi;
  • -z — ma’lumotlarni tarmoq orqali siqib uzatish (sekin aloqada foydali, tez lokal tarmoqda deyarli farq qilmaydi);
  • --delete — manbada endi mavjud bo'lmagan fayllarni manzildan olib tashlaydi (haqiqiy sinxronlash uchun);
  • --exclude=<pattern> — muayyan fayl yoki katalogni uzatishdan chiqarib tashlaydi;
  • --dry-run — hech narsani haqiqatan uzatmasdan nima bo'lishini ko'rsatadi;
  • -P — --progress va --partial birikmasi: uzatish jarayonini foizda ko'rsatadi va uzilgan uzatishni davom ettirishda qisman uzatilgan faylni tashlab yubormasdan saqlab qoladi.

Sukut bo'yicha bo'lmagan portga yoki muayyan kalit bilan ulanish: -e

scp dan farqli o'laroq, rsync da SSH parametrlari uchun o'zining -P/-i flag'lari yo'q — buning o'rniga u butun SSH buyrug'ini -e flag'iga topshiradi. Kuchaytirilgan, nostandart portdagi serverga yoki muayyan kalit bilan sinxronlash shunday bajariladi:

rsync -avz -e "ssh -p 2222 -i ~/.ssh/id_ed25519" ./dist/ [email protected]:/var/www/myapp/

Qo'shtirnoq ichidagi hamma narsa — rsync ulanishni ochish uchun ishlatadigan aynan o'sha ssh chaqiruvi. E’tibor bering: rsync ning o'z -p flag'i portni o'rnatmaydi — u "ruxsatlarni saqlash" degani, shuning uchun sukut bo'yicha bo'lmagan port har doim -e "ssh -p ..." orqali berilishi kerak; bu chalkashlikka e’tibor qilishga arziydi.

Oxiridagi / nega muhim

rsync -av ./dist alice@server:/var/www/

dist katalogining o'zini /var/www/dist/ sifatida nusxalaydi, holbuki

rsync -av ./dist/ alice@server:/var/www/

dist ning mazmunini (katalogning o'zini emas) to'g'ridan-to'g'ri /var/www/ ga nusxalaydi. Bu farqni bilmaslik fayllarning noto'g'ri joyga tushib qolishining eng keng tarqalgan yagona sababi.

Avval sinab ko'rish: --dry-run

Ayniqsa --delete bilan birga uzatishni haqiqatan ishga tushirishdan oldin nima bo'lishini ko'rib olishga arziydi:

rsync -avz --delete --dry-run ./dist/ [email protected]:/var/www/myapp/
sending incremental file list
deleting old-bundle.js
index.html
assets/style.css
assets/app.js

sent 1,204 bytes  received 96 bytes  866.67 bytes/sec
total size is 245,120  speedup is 188.60 (DRY RUN)

(DRY RUN) belgisi aslida hech narsa o'zgartirilmaganini tasdiqlaydi. Agar natija to'g'ri ko'rinsa, --dry-run ni olib tashlab, buyruqni qayta ishga tushirish kifoya.

Fayllarni chiqarib tashlash

rsync -avz --exclude='.git/' --exclude='node_modules/' ./project/ alice@server:/srv/project/

Bu uzatish paytida versiyalarni boshqarish katalogini yoki og'ir, qayta yaratish mumkin bo'lgan bog'liqliklar papkasini o'tkazib yuborishning standart usuli.

scp va rsync o'rtasida tanlash

Vaziyat Tavsiya etilgan vosita
Bitta fayl, tezkor bir martalik nusxa scp
Katta katalogni muntazam sinxronlash (deploy, zaxira) rsync
Beqaror yoki sekin tarmoq rsync (-P davom ettirish imkonini beradi)
Ikki tomonni sinxron saqlash, faqat o'zgarganini yuborish rsync
Skriptda mutlaq minimal sintaksis kerak scp

Amalda takrorlanuvchi production deploy yoki zaxira skriptlari deyarli har doim rsync ga tayanadi — buni Backup avtomatlashtirish maqolasida amaliyroq kontekstda ko'rish mumkin.

Amaliy vaziyat: uzilgan uzatishni davom ettirish

Muammo: 2 GB hajmdagi zaxira arxivini scp bilan masofaviy serverga nusxalash tarmoq uzilishi sababli to'xtab qoldi va 60% da tugadi.

1-qadam — muammoni tushunish: scp bilan qayta boshlash fayl yana noldan nusxalanishini anglatadi — sekin ulanishda vaqt behuda ketadi.

2-qadam — rsync ga o'tish:

rsync -avzP backup-2026-07-25.tar.gz [email protected]:~/backups/

3-qadam — uzatish jarayonini kuzatish:

backup-2026-07-25.tar.gz
  1,258,291,200  61%   14.2MB/s    0:00:34

Tarmoq yana uzilsa, buyruqni shunchaki qayta ishga tushirish kifoya — -P (--partial) tufayli rsync allaqachon uzatilgan qismni saqlab qoladi va boshidan boshlash o'rniga faqat o'sha joydan davom etadi.

4-qadam — tugagach tekshirish:

ssh [email protected] "sha256sum ~/backups/backup-2026-07-25.tar.gz"
sha256sum backup-2026-07-25.tar.gz

Mos keladigan checksum’lar fayl to'liq va shikastlanmagan holda yetib kelganini tasdiqlaydi.

5-qadam — natija va hujjatlashtirish: davom ettirishga arziydigan katta fayllar uchun endi scp o'rniga rsync -P standart amaliyot sifatida qabul qilindi.

Keng tarqalgan xatolar

rsync da manba katalogi oxiridagi / ni e’tiborsiz qoldirish

Yuqorida tushuntirilganidek, bu fayllarning mo'ljallanganidan bir daraja chuqurroq yoki yuqoriroq joyga tushib qolishiga olib keladi. Haqiqiy uzatishdan oldin --dry-run bilan tekshirish buni oldindan ushlab qoladi.

--delete ni avval tekshirmasdan ishga tushirish

--delete manbada endi mavjud bo'lmagan fayllarni manzildan qaytarib bo'lmaydigan qilib olib tashlaydi. Nima o'chirilishini har doim avval --dry-run bilan tekshiring.

scp -P ni ssh -p bilan adashtirish

scp port uchun katta -P dan, ssh esa kichik -p dan foydalanadi. Noto'g'ri registrdan foydalanish odatda "unknown option" xatosini beradi.

Katta uzatishlarda doim scp ga murojaat qilish

Kichik, bir martalik fayl uchun bu muammo emas, lekin muntazam yoki katta uzatishlar uchun scp ning davom ettira olmasligi yoki farqlarni aniqlay olmasligi sezilarli vaqtni behuda sarflaydi.

Mashqlar

  1. Kichik faylni scp bilan nusxalang, so'ng xuddi shu faylni ikkinchi marta rsync -avz bilan nusxalang va fayl o'zgarmagani uchun rsync ikkinchi safar hech narsa yubormasligini kuzating.
  2. Loyiha katalogini serverga sinxronlang va --exclude bilan kamida ikkita andozani chiqarib tashlang.
  3. Qaysi fayllar olib tashlanishini ko'rish uchun katalogni --dry-run --delete bilan solishtiring, so'ng sinxronlashni --dry-run siz haqiqatan ishga tushiring.
  4. Yuqoridagi vaziyatni simulyatsiya qiling: katta fayl uzatishini Ctrl+C bilan to'xtating, so'ng uni rsync -P bilan davom ettiring va faqat qolgan qism uzatilganini tasdiqlang.

Mashqni bajardim deyish uchun: 4-mashqda davom ettirilgan uzatish ko'rsatgan ma’lumotlar hajmi to'liq fayl hajmidan sezilarli darajada kichik bo'lishi kerak — agar rsync butun faylni qayta yuborsa, -P (--partial) aslida ishlamagan.

Manbalar