Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "KSNK" các nội dung bạn quan tâm.

Copy local - server, server - server

ICT

SCP vs RSYNC: chọn lệnh nào để copy dữ liệu qua SSH?

Bài này giúp bạn chọn nhanh giữa scprsync khi cần sao chép dữ liệu giữa local ↔ server hoặc server ↔ server.

  • Nếu bạn đang ở trong 1 server (ssh), thì server bạn đang làm việc đó xem như local. Và dùng hướng dẫn local ↔ server.

  • Nếu bạn đang ở 1 máy local, và copy dữ liệu giữa 2 server khác thì sử dụng hướng dẫn local ↔ server

Có ví dụ sẵn dùng với cú pháp root@ip_server.


1. Tóm tắt khác biệt

Tiêu chíscprsync
Nhanh-gọn, có sẵn✅ Rất đơn giản, hầu như máy nào cũng có✅ Phổ biến, nhưng nhiều tuỳ chọn hơn
Tiếp tục lại (resume)❌ Không✅ Có (chỉ gửi phần khác biệt)
Đồng bộ 1 chiều (chỉ copy thay đổi)
Giữ quyền/timestamp/symlink⚠️ Cần -p/-r✅ Dùng -a (archive)
Theo dõi tiến trình⚠️ Hạn chế (-v)--progress, --info=progress2
Nén khi truyền-C-z
Loại trừ file/thư mục--exclude, --exclude-from
Xoá ở đích các file không còn ở nguồn--delete
Giới hạn băng thông-l (kbit/s)--bwlimit
Copy server → server trực tiếp⚠️ Có thể dùng scp -3✅ Rất tiện (chạy từ local)

Khi nào dùng nhanh:

  • Việc nhỏ, one-shot, ít cần tuỳ chọn: dùng scp.

  • Đồng bộ hoá, dữ liệu lớn, cần tiếp tục/gỡ lỗi/chính sách loại trừ: dùng rsync.


2. Quy tắc “đường gạch chéo” quan trọng

  • Với rsync:

    • rsync SRC DEST → copy cả thư mục SRC vào DEST.

    • rsync SRC/ DEST → copy nội dung bên trong SRC vào DEST (không tạo thêm lớp thư mục).

  • Với scp: thường chỉ cần nhớ -r khi copy thư mục.


3. Ví dụ thực tế

Giả sử local của bạn là máy CRAWL (WSL/Ubuntu), thư mục đích local:
/mnt/e/Folder1/Subfolder1/
Server là root@ip_server.
SSH mặc định port 22 (nếu khác, xem phần “Cổng SSH khác 22”).

3.1. Local → Server (đẩy lên server)

SCP (nhanh-gọn, one-shot):

# Đẩy cả thư mục lên /mnt/data/d2/ trên server
scp -r /mnt/e/Folder1/Subfolder1/Crawler root@ip_server:/mnt/data/d2/

 

RSYNC (khuyên dùng cho đồng bộ):

# Đồng bộ thư mục Crawler (giữ quyền, timestamp), nén & hiển thị tiến trình
rsync -avz --progress /mnt/e/Folder1/Subfolder1/Crawler/ root@ip_server:/mnt/data/d2/Crawler/
# Lưu ý dấu / sau Crawler/ để chỉ copy NỘI DUNG bên trong 

 

Một số tuỳ chọn hay dùng với rsync khi đẩy lên:

# Loại trừ thư mục .git và file tạm
rsync -avz --progress --exclude ".git" --exclude "*.tmp" SRC/ root@ip_server:/path/DST/
# Chỉ cập nhật file mới hơn (tránh overwrite file đích mới hơn)
rsync -avzu --progress SRC/ root@ip_server:/path/DST/
# Đồng bộ “sạch”: xoá ở đích các file không còn ở nguồn
rsync -avz --delete --progress SRC/ root@ip_server:/path/DST/

3.2. Local ← Server (tải về local)

SCP:

# Tải cả thư mục từ server về local
scp -r root@ip_server:/mnt/data/d2/Crawler /mnt/e/Folder1/Subfolder1/

 

RSYNC (an toàn & có resume):

rsync -avz --progress root@ip_server:/mnt/data/d2/Crawler/ /mnt/e/Folder1/Subfolder1/Crawler/

3.3. Server → Server (truyền giữa 2 server, chạy lệnh từ local)

Giả sử có server Aserver B:

  • root@ip_server_A

  • root@ip_server_B

SCP (qua máy local làm trung gian):

# -3 ép copy “third-party” qua local (không viết tạm file, nhưng dữ liệu đi qua local)
scp -3 -r root@ip_server_A:/mnt/data/d2/Crawler root@ip_server_B:/mnt/backup/

 

RSYNC (tiện và linh hoạt):

# Đồng bộ trực tiếp A -> B, chạy từ local; dữ liệu vẫn đi qua local (tunnel qua SSH)
rsync -avz --progress -e ssh root@ip_server_A:/mnt/data/d2/Crawler/ root@ip_server_B:/mnt/backup/Crawler/

Mẹo nâng cao: Nếu hai server thấy nhau trực tiếp (A SSH được sang B), có thể SSH vào A rồi chạy rsync A→B ngay trên A để đường truyền không đi qua local.


4. Dùng cổng SSH khác 22

SCP:

scp -P 2222 -r /local/path root@ip_server:/remote/path

 

RSYNC:

rsync -avz -e "ssh -p 2222" /local/path root@ip_server:/remote/path

5. Mẹo & tình huống thường gặp

  • Tiếp tục truyền/Resume: dùng rsync (scp không resume tốt).

  • Giảm tải mạng: -C (scp), -z (rsync) để nén; giới hạn băng thông: scp -l 5000 (kbit/s) hoặc rsync --bwlimit=5m.

  • Giữ nguyên quyền & thời gian: scp -p, hoặc tốt hơn rsync -a.

  • Loại trừ file/thư mục: chỉ rsync: --exclude "node_modules" hoặc --exclude-from list.txt.

  • Xoá ở đích cho khớp nguồn: rsync --delete (cẩn trọng, test trước bằng --dry-run).

  • Xem thử trước khi chạy thật: rsync --dry-run -avz SRC/ DEST/.

  • Đường dẫn có khoảng trắng: đặt trong dấu nháy "..." hoặc escape \ .

  • Fingerprint/Host key lần đầu: kiểm tra kỹ để tránh MITM; gõ yes khi đúng server.

  • Lỗi quyền ghi: kiểm tra quyền thư mục đích (ví dụ /mnt/e/... trên WSL phải có quyền ghi).

  • Tiến trình rõ ràng: rsync --info=progress2 hiển thị tổng quan, dễ theo dõi file lớn.


6. Quyết định nhanh

  • Copy nhanh 1 lần, ít file, không cần đồng bộ: dùng scp.

  • Dự án crawl/backup, dữ liệu lớn, lặp lại nhiều lần, cần loại trừ & resume: dùng rsync.

  • Truyền server ↔ server: ưu tiên rsync (hoặc scp -3 khi cần thật đơn giản).


7. Mẫu lệnh “copy-paste” theo tình huống

Local → Server

# scp
scp -r /mnt/e/Folder1/Subfolder1/Crawler root@ip_server:/mnt/data/d2/
# rsync
rsync -avz --progress /mnt/e/Folder1/Subfolder1/Crawler/ root@ip_server:/mnt/data/d2/Crawler/

 

Local ← Server

# scp
scp -r root@ip_server:/mnt/data/d2/Crawler /mnt/e/Folder1/Subfolder1/
# rsync
rsync -avz --progress root@ip_server:/mnt/data/d2/Crawler/ /mnt/e/Folder1/Subfolder1/Crawler/

 

Server → Server (chạy từ local)

# scp (qua local)
scp -3 -r root@ip_server_A:/mnt/data/d2/Crawler root@ip_server_B:/mnt/backup/
# rsync (khuyên dùng)
rsync -avz --progress -e ssh root@ip_server_A:/mnt/data/d2/Crawler/ root@ip_server_B:/mnt/backup/Crawler/