TL;DR — 1 đoạn ngắn 2-3 câu
Khi cần chuyển file lên VPS, scp là nhanh nhất để dùng ngay, rsync phù hợp nhất cho đồng bộ và backup, còn sftp dễ dùng hơn nếu bạn thích thao tác kiểu “mở thư mục rồi upload/download”. Với người mới, chỉ cần hiểu: cùng đi qua SSH, nhưng mỗi công cụ có cách dùng và điểm mạnh khác nhau.
- Phù hợp: người mới dùng Ubuntu VPS, cần upload code, backup file, tải log.
- Áp dụng: Ubuntu 22.04/24.04, máy cá nhân Linux/macOS/Windows có SSH client.
- Test trên: Ubuntu Server 22.04 và 24.04 với OpenSSH mặc định.
- Mục tiêu: biết chọn đúng công cụ, chạy được lệnh cơ bản, tránh lỗi permission/path/port.
Vì sao cần chọn đúng công cụ chuyển file VPS ngay?
Khi mới thuê VPS, bạn thường mắc ở bước rất “cơ bản”: làm sao đẩy source code, file cấu hình, database dump hoặc ảnh backup lên server. Chọn sai công cụ có thể khiến upload chậm, ghi đè nhầm file, mất thời gian copy lại từ đầu, hoặc bị lỗi quyền truy cập.
- 🚀 Đẩy code nhanh: upload project lên
/var/wwwhoặc thư mục home. - 🔁 Đồng bộ lặp lại: chỉ gửi file thay đổi, không copy lại toàn bộ.
- 🧯 Backup an toàn: kéo dữ liệu từ VPS về máy cá nhân.
- 🔐 Đi qua SSH: không cần mở FTP truyền thống kém an toàn.
- 🧭 Dễ debug: biết lỗi do path, user, port hay permission.
SCP: nhanh, đơn giản, hợp để copy một lần
Tóm gọn: Dùng scp khi bạn cần copy file/thư mục nhanh qua SSH và không cần đồng bộ thông minh.
scp là lệnh quen thuộc nhất với người mới vì cú pháp gần giống cp. Bạn chỉ cần biết file nguồn, user, IP VPS và đường dẫn đích.
Copy một file từ máy cá nhân lên VPS
Giả sử bạn có file index.html trên máy cá nhân và muốn upload vào thư mục home của user ubuntu trên VPS.
scp index.html ubuntu@YOUR_SERVER_IP:/home/ubuntu/
Output mẫu:
index.html 100% 1.2KB 85.4KB/s 00:00
Nếu VPS dùng port SSH khác 22, ví dụ 2222, thêm -P viết hoa:
scp -P 2222 index.html ubuntu@YOUR_SERVER_IP:/home/ubuntu/
Các thành phần cần nhớ:
index.html: file nguồn trên máy cá nhân.ubuntu@YOUR_SERVER_IP: user SSH và IP VPS./home/ubuntu/: thư mục đích trên VPS.-P 2222: chỉ định port SSH, lưu ýscpdùng-Pviết hoa.
💡 Mẹo: Nếu chưa chắc đường dẫn đích tồn tại, hãy SSH vào VPS trước và chạy
pwdhoặclsđể kiểm tra.
Copy cả thư mục lên VPS
Muốn copy thư mục my-app lên VPS, dùng -r để copy đệ quy.
scp -r my-app ubuntu@YOUR_SERVER_IP:/home/ubuntu/
Output mẫu:
app.js 100% 2.1KB 130.0KB/s 00:00
package.json 100% 512B 42.0KB/s 00:00
README.md 100% 900B 61.0KB/s 00:00
Các flag thường dùng:
-r: copy cả thư mục và file con bên trong.-P: port SSH, ví dụ-P 2222.-i: dùng SSH key riêng, ví dụ-i ~/.ssh/id_ed25519.-v: bật log chi tiết để debug kết nối.
Ví dụ dùng SSH key:
scp -i ~/.ssh/id_ed25519 -r my-app ubuntu@YOUR_SERVER_IP:/home/ubuntu/
⚠️ Cảnh báo:
scpcó thể ghi đè file đích nếu trùng tên. Hãy kiểm tra kỹ path trước khi copy lên thư mục quan trọng như/etc,/var/www.
Tải file từ VPS về máy cá nhân
Chiều ngược lại cũng tương tự: đặt VPS làm nguồn và máy cá nhân làm đích.
scp ubuntu@YOUR_SERVER_IP:/var/log/syslog ./syslog-from-vps.log
Output mẫu:
syslog 100% 856KB 1.5MB/s 00:01
Giải thích:
ubuntu@YOUR_SERVER_IP:/var/log/syslog: file nguồn trên VPS../syslog-from-vps.log: file đích trên máy cá nhân../: thư mục hiện tại bạn đang đứng trên máy cá nhân.
rsync: lựa chọn tốt nhất để đồng bộ, backup và deploy nhiều lần
Tóm gọn: Dùng rsync khi bạn cần copy thông minh: chỉ gửi phần thay đổi, giữ quyền file, xem trước trước khi chạy thật.
rsync mạnh hơn scp ở chỗ nó có thể so sánh nguồn và đích. Nếu bạn upload lại cùng một project, rsync chỉ chuyển file mới hoặc file đã thay đổi.
Cài rsync trên Ubuntu
Trên Ubuntu 22.04/24.04, rsync thường đã có sẵn. Nếu chưa có, cài bằng apt.
sudo apt update
sudo apt install -y rsync
rsync --version
Output mẫu:
rsync version 3.2.7 protocol version 31
Copyright (C) 1996-2022 by Andrew Tridgell, Wayne Davison, and others.
Giải thích:
sudo apt update: cập nhật danh sách package.sudo apt install -y rsync: càirsync, tự động xác nhận.rsync --version: kiểm tra phiên bản đã cài.
💡 Mẹo: Nên cài
rsyncở cả máy local và VPS để tránh lỗi “command not found” khi đồng bộ qua SSH.
Đồng bộ thư mục project lên VPS
Ví dụ bạn có thư mục my-app/ trên máy cá nhân và muốn đưa vào /home/ubuntu/my-app/ trên VPS.
rsync -avz my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
Output mẫu:
sending incremental file list
./
app.js
package.json
public/
public/logo.png
sent 18,420 bytes received 96 bytes 37,032.00 bytes/sec
total size is 52,100 speedup is 2.81
Các flag quan trọng:
-a: archive mode, giữ quyền, owner, timestamp, symlink tương đối tốt.-v: verbose, hiển thị file đang chuyển.-z: nén khi truyền, hữu ích với file text hoặc mạng chậm.my-app/: dấu/cuối thư mục nghĩa là copy nội dung bên trong./home/ubuntu/my-app/: thư mục đích trên VPS.
Điểm cực kỳ quan trọng với rsync là dấu / cuối source:
rsync -avz my-app ubuntu@YOUR_SERVER_IP:/home/ubuntu/
rsync -avz my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
Hai lệnh trên thường cho kết quả tương đương về mặt thư mục đích, nhưng cách hiểu khác nhau:
my-app: copy cả thư mụcmy-app.my-app/: copy nội dung bên trongmy-app.- Với người mới, hãy luôn viết rõ thư mục đích để tránh nhầm.
⚠️ Cảnh báo: Dấu
/cuối source trongrsyncrất dễ gây nhầm. Nếu đang đồng bộ thư mục quan trọng, hãy chạy thử với--dry-run.
Xem trước bằng dry-run trước khi đồng bộ thật
--dry-run giúp bạn biết rsync sẽ làm gì mà chưa thực sự copy/xóa gì.
rsync -avz --dry-run my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
Output mẫu:
sending incremental file list
./
app.js
config.example.ini
sent 245 bytes received 28 bytes 546.00 bytes/sec
total size is 12,450 speedup is 45.60 (DRY RUN)
Giải thích:
--dry-run: chạy thử, không thay đổi file đích.- Kết hợp với
-vđể xem danh sách file sẽ được chuyển. - Rất hữu ích trước khi dùng
--delete.
Đồng bộ và xóa file thừa ở đích
Khi deploy project, bạn có thể muốn VPS giống hệt thư mục local. Lúc đó dùng --delete.
rsync -avz --delete my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
Output mẫu:
sending incremental file list
deleting old-cache.txt
./
app.js
sent 2,104 bytes received 72 bytes 4,352.00 bytes/sec
total size is 12,600 speedup is 5.79
Các điểm cần hiểu:
--delete: xóa file ở đích nếu file đó không còn ở nguồn.- Phù hợp để deploy thư mục build.
- Nguy hiểm nếu bạn trỏ nhầm thư mục đích.
⚠️ Cảnh báo: Không dùng
--deletekhi chưa chắc source và destination. Hãy chạy--dry-runtrước ít nhất một lần.
sftp: thao tác tương tác, dễ hiểu cho người mới
Tóm gọn: Dùng sftp khi bạn muốn mở phiên làm việc qua SSH rồi upload/download file bằng lệnh tương tác.
sftp không phải FTP truyền thống. Nó chạy qua SSH, nên thường dùng chung user, password/key và port với SSH.
Mở phiên sftp vào VPS
Kết nối đến VPS bằng user ubuntu.
sftp ubuntu@YOUR_SERVER_IP
Output mẫu:
Connected to YOUR_SERVER_IP.
sftp>
Nếu VPS dùng port khác:
sftp -P 2222 ubuntu@YOUR_SERVER_IP
Một số lệnh cơ bản trong phiên sftp:
pwd
lpwd
ls
lls
cd /home/ubuntu
lcd ~/Downloads
put index.html
get server.log
bye
Output mẫu:
Remote working directory: /home/ubuntu
Local working directory: /home/user/Downloads
Uploading index.html to /home/ubuntu/index.html
index.html 100% 1200 80.0KB/s 00:00
Giải thích nhanh:
pwd: xem thư mục hiện tại trên VPS.lpwd: xem thư mục hiện tại trên máy local.ls: liệt kê file trên VPS.lls: liệt kê file trên máy local.cd: đổi thư mục trên VPS.lcd: đổi thư mục trên máy local.put: upload file lên VPS.get: download file từ VPS.bye: thoát phiênsftp.
💡 Mẹo: Trong
sftp, chữlở đầu thường nghĩa là “local”, ví dụlpwd,lcd,lls.
Upload cả thư mục bằng sftp
sftp có thể upload thư mục với put -r, nhưng không mạnh bằng rsync.
sftp ubuntu@YOUR_SERVER_IP
Trong prompt sftp>:
mkdir my-app
cd my-app
put -r ./my-app/*
bye
Output mẫu:
Uploading ./my-app/app.js to /home/ubuntu/my-app/app.js
Uploading ./my-app/package.json to /home/ubuntu/my-app/package.json
Các điểm cần lưu ý:
mkdir my-app: tạo thư mục trên VPS nếu chưa có.cd my-app: chuyển vào thư mục đích trên VPS.put -r: upload đệ quy../my-app/*: upload nội dung bên trong thư mục local.
⚠️ Cảnh báo:
sftpkhông tối ưu cho deploy nhiều lần. Nếu cần đồng bộ lặp lại, hãy dùngrsync.
Chọn công cụ nào trong từng tình huống?
Tóm gọn: Nếu chỉ copy nhanh dùng scp; nếu đồng bộ/deploy/backup dùng rsync; nếu thích thao tác tương tác dùng sftp.
Không có công cụ “tốt nhất cho mọi việc”. Điểm quan trọng là chọn đúng theo tình huống để đỡ mất thời gian.
Bảng chọn nhanh
| Nhu cầu | Nên dùng | Lý do |
|---|---|---|
| Upload 1 file cấu hình | scp | Nhanh, cú pháp ngắn |
| Upload cả project lần đầu | scp hoặc rsync | scp đơn giản, rsync chuẩn hơn |
| Deploy project nhiều lần | rsync | Chỉ chuyển file thay đổi |
| Backup thư mục từ VPS về máy | rsync | Giữ cấu trúc, quyền, timestamp |
| Tải vài file log thủ công | sftp hoặc scp | Dễ chọn file |
| VPS dùng port SSH khác | Cả 3 đều dùng được | Chỉ khác flag port |
Ví dụ deploy project web bằng rsync
Giả sử bạn build website tĩnh ra thư mục dist/ và muốn đưa lên /var/www/example.
Trên VPS, tạo thư mục và cấp quyền cho user hiện tại:
sudo mkdir -p /var/www/example
sudo chown -R "$USER":"$USER" /var/www/example
Output mẫu:
Từ máy cá nhân, đồng bộ thư mục dist/ lên VPS:
rsync -avz --delete dist/ ubuntu@YOUR_SERVER_IP:/var/www/example/
Output mẫu:
sending incremental file list
./
index.html
assets/
assets/app.css
assets/app.js
sent 45,210 bytes received 118 bytes 90,656.00 bytes/sec
total size is 180,420 speedup is 3.98
Giải thích:
dist/: chỉ copy nội dung sau khi build./var/www/example/: thư mục web trên VPS.--delete: xóa file cũ không còn trong bản build mới.chown: cho phép user SSH ghi vào thư mục đích.
💡 Mẹo: Với thư mục web, nên deploy bằng user thường rồi cấu hình quyền rõ ràng. Tránh upload trực tiếp bằng
rootnếu không cần.
Ví dụ backup thư mục từ VPS về máy cá nhân
Bạn muốn kéo /home/ubuntu/my-app/ từ VPS về máy local, lưu vào ./backup-my-app/.
rsync -avz ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/ ./backup-my-app/
Output mẫu:
receiving incremental file list
./
app.js
package.json
uploads/
uploads/avatar.png
sent 88 bytes received 24,810 bytes 49,796.00 bytes/sec
total size is 90,220 speedup is 3.62
Giải thích:
- Source nằm trên VPS.
- Destination nằm trên máy cá nhân.
- Dùng
/cuối source để backup nội dung thư mục. - Có thể chạy lại nhiều lần,
rsyncchỉ kéo phần thay đổi.
⚠️ Cảnh báo: Backup về máy cá nhân không thay thế backup định kỳ trên hệ thống production. Nhưng đây là bước đơn giản, rất nên làm trước khi sửa cấu hình lớn.
Dùng SSH key, port khác và file cấu hình để đỡ gõ dài
Tóm gọn: Cấu hình SSH tốt giúp scp, rsync, sftp ngắn hơn, ít lỗi hơn và an toàn hơn.
Cả ba công cụ đều đi qua SSH. Vì vậy, nếu SSH key và ~/.ssh/config hoạt động tốt, việc chuyển file sẽ nhẹ nhàng hơn nhiều.
Tạo SSH key trên máy cá nhân
Nếu chưa có SSH key, tạo key Ed25519:
ssh-keygen -t ed25519 -C "[email protected]"
Output mẫu:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
Copy public key lên VPS:
ssh-copy-id ubuntu@YOUR_SERVER_IP
Output mẫu:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ubuntu@YOUR_SERVER_IP'"
Giải thích:
ssh-keygen: tạo cặp private key và public key.id_ed25519: private key, giữ kín trên máy cá nhân.id_ed25519.pub: public key, có thể đặt lên VPS.ssh-copy-id: thêm public key vào~/.ssh/authorized_keystrên VPS.
⚠️ Cảnh báo: Không gửi file private key
id_ed25519cho người khác. Ai có private key có thể đăng nhập như bạn nếu server tin key đó.
Tạo alias SSH để lệnh ngắn hơn
Mở file cấu hình SSH trên máy cá nhân:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/config
Thêm nội dung sau:
Host myvps
HostName YOUR_SERVER_IP
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
Cấp quyền đúng cho file config:
chmod 600 ~/.ssh/config
Từ đây, bạn có thể dùng alias myvps.
ssh myvps
scp index.html myvps:/home/ubuntu/
rsync -avz my-app/ myvps:/home/ubuntu/my-app/
sftp myvps
Output mẫu khi SSH:
Welcome to Ubuntu 24.04 LTS
Giải thích:
Host myvps: tên alias tự đặt.HostName: IP hoặc hostname VPS.User: user SSH mặc định.Port: port SSH.IdentityFile: đường dẫn private key.
💡 Mẹo: Nếu bạn quản lý nhiều VPS,
~/.ssh/configgiúp tránh gõ nhầm IP, user hoặc port.
Kiểm tra quyền, đường dẫn và dung lượng trước khi copy
Tóm gọn: Rất nhiều lỗi chuyển file không nằm ở scp/rsync/sftp, mà nằm ở quyền ghi, sai đường dẫn hoặc VPS hết dung lượng.
Trước khi upload vào thư mục hệ thống như /var/www, /etc, /opt, hãy kiểm tra kỹ. Người mới thường đăng nhập bằng user thường nên không có quyền ghi ở nhiều thư mục.
Kiểm tra thư mục hiện tại và quyền ghi
SSH vào VPS:
ssh ubuntu@YOUR_SERVER_IP
Kiểm tra user, thư mục hiện tại và quyền:
whoami
pwd
ls -ld /home/ubuntu /var/www /var/www/example
Output mẫu:
ubuntu
/home/ubuntu
drwxr-x--- 5 ubuntu ubuntu 4096 May 15 10:00 /home/ubuntu
drwxr-xr-x 3 root root 4096 May 15 10:10 /var/www
drwxr-xr-x 2 ubuntu ubuntu 4096 May 15 10:12 /var/www/example
Giải thích:
whoami: bạn đang là user nào.pwd: đang đứng ở thư mục nào.ls -ld: xem quyền của chính thư mục, không liệt kê nội dung.- Nếu owner là
root, user thường có thể không ghi được.
💡 Mẹo: Với người mới, hãy upload vào
/home/ubuntu/trước. Khi đã chắc file đúng, hãy dùngsudotrên VPS để di chuyển vào thư mục hệ thống.
Kiểm tra dung lượng VPS
Nếu upload bị dừng giữa chừng, hãy kiểm tra dung lượng đĩa.
df -h
du -sh /home/ubuntu/*
Output mẫu:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 40G 18G 20G 48% /
1.2G /home/ubuntu/my-app
500M /home/ubuntu/backups
Giải thích:
df -h: xem dung lượng filesystem.du -sh: xem dung lượng từng thư mục/file.Avail: dung lượng còn trống.Use%: phần trăm đã sử dụng.
⚠️ Cảnh báo: Không nên để disk VPS chạm 100%. Dịch vụ có thể lỗi ghi log, database có thể ngừng hoạt động.
Pitfalls & lỗi thường gặp
1. Permission denied khi upload vào /var/www
Lỗi mẫu:
scp: dest open "/var/www/example/index.html": Permission denied
Cách fix:
ssh ubuntu@YOUR_SERVER_IP
sudo mkdir -p /var/www/example
sudo chown -R ubuntu:ubuntu /var/www/example
Sau đó upload lại:
scp index.html ubuntu@YOUR_SERVER_IP:/var/www/example/
Nếu không muốn đổi owner, upload vào home trước:
scp index.html ubuntu@YOUR_SERVER_IP:/home/ubuntu/
ssh ubuntu@YOUR_SERVER_IP
sudo mv /home/ubuntu/index.html /var/www/example/
2. Sai port SSH
Lỗi mẫu:
ssh: connect to host YOUR_SERVER_IP port 22: Connection refused
scp: Connection closed
Cách fix với từng công cụ:
scp -P 2222 index.html ubuntu@YOUR_SERVER_IP:/home/ubuntu/
rsync -avz -e "ssh -p 2222" my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
sftp -P 2222 ubuntu@YOUR_SERVER_IP
Lưu ý:
scp: dùng-Pviết hoa.sftp: dùng-Pviết hoa.rsync: dùng-e "ssh -p PORT".
3. rsync: command not found
Lỗi mẫu:
bash: line 1: rsync: command not found
rsync error: remote command not found (code 127)
Cách fix trên VPS:
ssh ubuntu@YOUR_SERVER_IP
sudo apt update
sudo apt install -y rsync
Kiểm tra lại:
rsync --version
4. Nhầm dấu / trong rsync làm lệch thư mục
Ví dụ bạn muốn nội dung nằm trong /home/ubuntu/my-app/, nhưng chạy nhầm:
rsync -avz my-app ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
Kết quả có thể thành:
/home/ubuntu/my-app/my-app/...
Cách an toàn hơn:
rsync -avz --dry-run my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
rsync -avz my-app/ ubuntu@YOUR_SERVER_IP:/home/ubuntu/my-app/
5. Upload chậm hoặc bị ngắt giữa chừng
Nguyên nhân thường gặp:
- Mạng local không ổn định.
- File quá lớn.
- VPS gần hết disk.
- SSH session bị timeout.
- Copy lại bằng
scpphải gửi lại từ đầu.
Cách xử lý:
rsync -avz --partial --progress big-file.tar.gz ubuntu@YOUR_SERVER_IP:/home/ubuntu/
Giải thích:
--partial: giữ phần đã chuyển nếu bị ngắt.--progress: hiển thị tiến độ.- Chạy lại lệnh,
rsynccó thể tiếp tục tốt hơnscp.
Key takeaways
scpphù hợp nhất khi cần copy nhanh một vài file hoặc thư mục nhỏ.rsynclà lựa chọn nên học sớm nếu bạn deploy, backup hoặc đồng bộ nhiều lần.sftpdễ hiểu cho người mới vì thao tác tương tác giống mở phiên quản lý file.- Cả ba đều chạy qua SSH, nên user, port, SSH key và firewall ảnh hưởng trực tiếp.
- Trước khi copy vào thư mục hệ thống, hãy kiểm tra quyền ghi, đường dẫn và dung lượng disk.
FAQ
SCP có còn nên dùng không?
Có. Với nhu cầu đơn giản như upload một file cấu hình, tải một file log, hoặc copy nhanh thư mục nhỏ, scp vẫn rất tiện.
rsync có khó hơn scp nhiều không?
Không quá khó nếu bạn bắt đầu với rsync -avz. Phần cần cẩn thận nhất là dấu / cuối thư mục và tùy chọn --delete.
sftp có phải FTP không?
Không theo nghĩa FTP truyền thống. sftp là SSH File Transfer Protocol, chạy qua SSH và thường dùng chung tài khoản đăng nhập SSH.
Nên upload file bằng root không?
Không nên nếu không cần. Tốt hơn là dùng user thường, upload vào thư mục có quyền phù hợp, rồi dùng sudo khi cần di chuyển file vào vị trí hệ thống.
Làm sao biết nên dùng port nào?
Port mặc định của SSH là 22. Nếu VPS của bạn đổi port, hãy kiểm tra cấu hình SSH hoặc thông tin quản trị VPS, rồi dùng -P với scp/sftp hoặc -e "ssh -p PORT" với rsync.
Công cụ nào tốt nhất để backup thư mục VPS về máy cá nhân?
rsync là lựa chọn tốt nhất cho backup lặp lại. Nó chỉ tải phần thay đổi, giữ cấu trúc thư mục tốt và có thể chạy lại nếu bị gián đoạn.
Cần VPS chạy SCP / rsync / sftp?
Bạn chỉ cần một VPS Linux có SSH ổn định là có thể dùng scp, rsync và sftp ngay cho upload code, backup dữ liệu và quản trị file. Nếu đang chuẩn bị dựng server để học Linux hoặc triển khai website, hãy chọn VPS phù hợp tại vsis.net/vps.
VSIS cung cấp VPS để bạn bắt đầu nhanh với Ubuntu, SSH và các tác vụ quản trị cơ bản mà bài viết này hướng dẫn.



