Fayl ko'chirish — scp va rsync

~10 daq · Linux · Tarmoq

Muammodan boshlaylik

Lokal kompyuterda frontend ni build qildingiz — dist/ papkasi, 300 ta fayl. Uni serverdagi /var/www/dokon ga qo'yish kerak. Ertaga yana bitta CSS fayl o'zgaradi — yana hammasini yuklaysizmi?

Yoki serverdan 2 GB lik zaxira nusxani yuklab olish kerak — va yarmida aloqa uziladi.

SSH (34-dars) orqali fayl ko'chirishning ikki vositasi bor: scp — oddiy nusxalash, rsync — aqlli sinxronizatsiya.


scp — SSH orqali cp

Sintaksis cp ga o'xshash, faqat masofaviy yo'l server:yo'l shaklida:

# Lokal → server
scp fayl.txt otabek@45.12.34.56:/tmp/
scp fayl.txt dokon:/tmp/                     # ~/.ssh/config dagi nom bilan

# Server → lokal
scp dokon:/var/backups/dokon.sql.gz ./

# Papka — -r
scp -r dist/ dokon:/var/www/dokon/

# Nostandart port — katta P
scp -P 2222 fayl.txt dokon:/tmp/

[!INFO] server: dan keyingi nisbiy yo'l — serverdagi uy papkadan hisoblanadi: dokon:fayl.txt = dokon:/home/deploy/fayl.txt. : ni unutsangiz — dokon nomli lokal fayl yaratiladi.

scp oddiy va hamma joyda bor. Lekin u har safar hamma narsani qaytadan ko'chiradi va uzilsa — boshidan boshlaydi.


rsync — faqat o'zgarganlarini

rsync manba va manzilni solishtiradi va faqat farqni ko'chiradi:

rsync -avz dist/ dokon:/var/www/dokon/

Birinchi marta — hamma narsa. Keyingi safar bitta CSS o'zgargan bo'lsa — faqat shu fayl (va hatto faylning faqat o'zgargan qismi). 300 ta fayl o'rniga — bitta, bir soniyada.

Asosiy bayroqlar

Bayroq Nima
-a Arxiv rejimi: rekursiv + ruxsatlar, vaqtlar, havolalar saqlanadi
-v Nima ko'chirilayotganini ko'rsatish
-z Uzatishda siqish
-h O'qiladigan hajmlar
-P Progress + uzilganda davom ettirish
-n Sinov (dry run) — nima qilinishini ko'rsatish, hech narsa qilmasdan
--delete Manbada yo'q fayllarni manzildan o'chirish
--exclude Chiqarib tashlash

Eng ko'p ishlatiladigan: rsync -avzP.

Oxiridagi / — muhim!

rsync -av dist/ dokon:/var/www/dokon/     # dist ning ICHIDAGILARI → dokon/ ga
rsync -av dist  dokon:/var/www/dokon/     # dist PAPKASINING O'ZI → dokon/dist/ ga
  • dist/ — "bu papkaning mazmuni"
  • dist — "bu papka"

Bu rsync dagi eng ko'p uchraydigan xato. Odatda manba/ → manzil/ (ikkalasida /) kerak.

--delete — to'liq aks ettirish

Lokalda eski.js ni o'chirdingiz. Oddiy rsync uni serverda qoldiradi. --delete bilan server lokalning aniq nusxasi bo'ladi:

rsync -avz --delete dist/ dokon:/var/www/dokon/

[!WARNING] --delete — xavfli: yo'l yoki / da xato qilsangiz, serverdagi kerakli fayllar o'chadi. Har doim avval -n bilan sinang:

rsync -avzn --delete dist/ dokon:/var/www/dokon/

Ro'yxatni ko'rib, deleting ... qatorlarini tekshiring — keyin -n siz.

Chiqarib tashlash

rsync -avz --exclude node_modules --exclude .git --exclude .env ./ dokon:/opt/dokon/
rsync -avz --exclude-from=.rsyncignore ./ dokon:/opt/dokon/

Katta fayllar va uzilishlar

rsync -avP dokon:/var/backups/dokon-2026-11-06.sql.gz ./

Aloqa uzilsa — xuddi shu buyruqni qayta ishga tushiring: rsync to'xtagan joyidan davom etadi (-P = --partial --progress).

Lokal ham ishlaydi

rsync faqat tarmoq uchun emas — lokal zaxira uchun ham ajoyib:

rsync -a --delete ~/loyihalar/ /mnt/fleshka/zaxira/

Amaliy: oddiy deploy skripti

#!/bin/bash
set -e
npm run build
rsync -avz --delete dist/ dokon:/var/www/dokon/
ssh dokon "sudo systemctl reload nginx"
echo "Deploy tugadi!"

Bir buyruq — build, faqat o'zgarganlarni yuklash, Nginx ni yangilash. (Bash skriptlar — 37-dars.)


Pipe orqali: tar + ssh

Juda ko'p kichik fayllar (masalan, 100 000 ta rasm) uchun — siqilgan oqim, fayl yaratmasdan (31-dars):

tar -czf - uploads/ | ssh dokon "tar -xzf - -C /var/www/dokon/"

- — "fayl o'rniga stdout/stdin". Lokal arxiv yaratilmaydi, diskda joy kerak emas.


sftp va grafik vositalar

sftp dokon
sftp> ls
sftp> get zaxira.sql.gz
sftp> put rasm.png
sftp> exit

Grafik interfeys kerak bo'lsa: FileZilla, WinSCP (Windows), Cyberduck (macOS) — barchasi SFTP (ya'ni SSH) orqali, xuddi shu kalitlar bilan ishlaydi. VS Code ning Remote-SSH kengaytmasi ham fayllarni sudrab tashlashga imkon beradi.


Qaysi biri qachon

Vaziyat Vosita
Bitta faylni tez ko'chirish scp
Papkani serverga qayta-qayta yuklash (deploy) rsync -avz --delete
Katta faylni yuklab olish rsync -avP
Juda ko'p kichik fayllar tar | ssh
Interaktiv ko'rib chiqish sftp yoki FileZilla

Nima uchun shunday?

rsync qanday qilib faqat o'zgargan qismni yuborishni biladi — buning uchun avval faylni solishtirish kerak emasmi?

rsync ning algoritmi aqlli: u ikki tomondagi faylni bloklarga bo'ladi va har bir blokning qisqa "barmoq izi"ni (checksum) hisoblaydi. Tarmoq orqali faqat shu barmoq izlari almashinadi — butun fayl emas. Mos kelmagan bloklargina yuboriladi. Natija: 1 GB fayldagi 10 KB o'zgarish uchun ~10 KB + barmoq izlari. Bundan tashqari, umuman o'zgarmagan fayllarni rsync hajm va vaqt bo'yicha darhol o'tkazib yuboradi. Shu algoritm tufayli rsync 1996 yildan beri zaxira va deploy vositalarining standarti bo'lib qolmoqda.


Xulosa

Eslab qoling:

  • scp fayl server:/yo'l/ — oddiy; papka — -r; port — -P (katta)
  • server: dan keyin nisbiy yo'l — uy papkadan
  • rsync -avzP manba/ server:/manzil/ — faqat o'zgarganlarini
  • Oxiridagi /: dist/ — mazmuni, dist — papkaning o'zi
  • --delete — aniq nusxa; avval -n bilan sinab ko'ring
  • --exclude node_modules
  • Uzilsa — xuddi shu rsync ni qayta ishga tushiring
  • tar -czf - papka | ssh server "tar -xzf - -C /manzil"

Keyingi dars

36-dars: Firewall — ufw bilan portlarni boshqarish