scp - Cách copy file qua SSH mà dev nào cũng nên biết
Không phải man page — chỉ những thứ tôi thực sự dùng trong công việc hàng ngày.
Nếu bạn đang làm việc với server Linux, sớm muộn gì bạn cũng sẽ cần chuyển file qua lại giữa máy local và remote. Có nhiều cách để làm điều này - FTP, rsync, SFTP client có GUI - nhưng scp vẫn là thứ tôi dùng nhiều nhất vì lý do đơn giản: nó có sẵn ở khắp nơi, không cần cài thêm gì, và cú pháp đủ ngắn để nhớ.
Bài này không phải man page. Tôi sẽ chỉ ghi lại những thứ tôi thực sự dùng trong công việc hàng ngày.
SCP là gì?
scp (Secure Copy Protocol) là công cụ copy file chạy trên nền SSH. Nghĩa là mọi thứ bạn transfer đều được mã hóa, và bạn dùng lại đúng SSH key/config mà bạn đã có - không cần setup thêm gì.
Cú pháp cơ bản
scp [options] source destinationTrong đó source hoặc destination có thể là local hoặc user@host:path. Chỉ cần nhớ quy tắc này là dùng được 90% các trường hợp.
Upload - Local to Remote
# Copy 1 file
scp file.txt user@192.168.1.10:/home/user/
# Copy vào thư mục cụ thể với tên mới
scp file.txt user@192.168.1.10:/home/user/newname.txt
# Copy cả folder (recursive)
scp -r ./myproject user@192.168.1.10:/home/user/
# Dùng SSH key thay vì password
scp -i ~/.ssh/my_key.pem file.txt ubuntu@13.214.x.x:/home/ubuntu/
Lưu ý nhỏ: Nếu bạn đã config
~/.ssh/configvới alias cho server thì dùng luôn alias đó được, không cần gõ IP dài. Ví dụ:scp file.txt myserver:/home/ubuntu/
Download - Remote to Local
# Download 1 file về thư mục hiện tại
scp user@192.168.1.10:/home/user/file.txt .
# Download về path cụ thể
scp user@192.168.1.10:/home/user/file.txt ~/Downloads/file.txt
# Download cả folder
scp -r user@192.168.1.10:/home/user/myproject ./local-copy
Cái hay ở đây là chỉ cần đổi vị trí source và destination so với lúc upload. Không có lệnh riêng cho “download” - logic hoàn toàn đối xứng.
Remote to Remote
# Copy thẳng từ server A sang server B (không qua local)
scp user1@server1:/path/file.txt user2@server2:/path/Cái này ít người biết. Thay vì download về local rồi upload lên, bạn có thể copy thẳng giữa 2 server. Hữu ích khi file lớn và băng thông local bị hạn chế.
Cảnh báo: Tính năng này hoạt động bằng cách máy local mở 2 kết nối SSH song song. Một số cấu hình server strict có thể block hoặc không hoạt động như kỳ vọng. Nếu gặp vấn đề, dùng
rsynchoặc SSH vào server A rồiscptừ đó sẽ chắc chắn hơn.
Các options hay dùng
-i key.pem- Chỉ định SSH private key-P 2222- SSH port khác (chú ý -P viết hoa, khác với ssh -p thường)-r- Recursive, copy cả folder-p- Giữ nguyên permission và timestamps-C- Compress data khi transfer, hữu ích với file text lớn-v- Verbose, bật khi debug lỗi kết nối-q- Quiet, tắt progress bar, dùng trong script-l 1000- Giới hạn bandwidth (Kbit/s), dùng khi không muốn chiếm hết đường truyền
Khi nào thì dùng rsync thay vì scp?
scp tốt cho việc copy đơn giản. Nhưng nếu bạn đang:
Sync folder lớn và muốn chỉ transfer phần thay đổi (không copy lại toàn bộ)
Cần resume khi kết nối bị đứt giữa chừng
Deploy code thường xuyên lên server
...thì rsync sẽ phù hợp hơn. Tôi sẽ viết về rsync trong bài sau.
Một vài lỗi thường gặp
“Permission denied” - Thường do SSH key sai hoặc user không có quyền ghi vào thư mục đích. Kiểm tra lại -i key và quyền của folder destination.
“No such file or directory” - Path trên remote cần tồn tại trước. scp không tự tạo folder như rsync —-mkpath. SSH vào server tạo folder trước rồi mới copy.
Port không phải 22 - Nhớ dùng -P viết hoa (khác với ssh -p thường). Đây là cái tôi vẫn hay gõ sai.
Bài tiếp theo tôi sẽ viết về rsync - mạnh hơn scp trong hầu hết use case thực tế, và một số pattern tôi hay dùng khi deploy. Nếu có câu hỏi gì về bài này, comment bên dưới nhé.


