Lệnh scp trong Linux — Cách sao chép file giữa các máy chủ

Bạn đã bao giờ rơi vào tình huống cần chuyển gấp một tệp cấu hình quan trọng từ máy tính cá nhân lên server để khắc phục sự cố hệ thống ngay lập tức chưa nhỉ? Với tư cách là một Senior System Admin, mình hiểu rằng việc đảm bảo dữ liệu được truyền tải an toàn và nhanh chóng giữa các môi trường là cực kỳ quan trọng, đặc biệt là khi làm việc với các hệ thống vps quan trọng. Đó chính là lý do scp là công cụ không thể thiếu trong túi đồ nghề của chúng ta. Vậy scp là gì và làm sao để làm chủ nó? scp Linux là một giao thức truyền tệp dựa trên SSH, giúp bạn thực hiện việc sao chép dữ liệu một cách bảo mật tuyệt đối. Trong bài viết này, mình sẽ hướng dẫn bạn cách dùng scp từ cơ bản đến nâng cao, đồng thời chia sẻ cách copy file giữa các máy chủ một cách chuyên nghiệp nhất. Cùng mình khám phá ngay nhé!

Cần chuẩn bị gì trước khi dùng lệnh scp?

  • Quyền người dùng: Có thể sử dụng với user thường, nhưng cần có quyền truy cập hợp lệ (username và password hoặc SSH key) vào tài khoản đích.
  • Hệ điều hành hỗ trợ: Hỗ trợ hầu hết các bản phân phối Linux (Ubuntu, Debian, CentOS, RHEL...), macOS và Windows (thông qua PowerShell hoặc Command Prompt).
  • Package dependencies: Yêu cầu gói OpenSSH Client đã được cài đặt trên máy nguồn và OpenSSH Server trên máy đích.
    • Ubuntu/Debian: sudo apt update && sudo apt install openssh-client openssh-server
    • CentOS/RHEL: sudo yum install openssh-clients openssh-server
  • Kết nối mạng: Yêu cầu kết nối mạng ổn định và cổng SSH (mặc định là 22) phải được mở trên tường lửa của máy đích.

Cú pháp lệnh scp là gì?

Lệnh scp hỗ trợ 2 dạng cú pháp chính để sao chép dữ liệu giữa các máy chủ trong hệ thống Linux/Unix.

scp [OPTIONS] SOURCE DESTINATION
scp [OPTIONS] SOURCE DESTINATION [FILE...]

Các tùy chọn của lệnh scp là gì?

Lệnh scp cung cấp các tùy chọn được phân theo hai nhóm chức năng chính: kiểm soát hành vi truyền tải và cấu hình kết nối SSH.

Tùy chọn ngắn Tùy chọn dài Mô tả
-r scp -r sao chép toàn bộ thư mục theo cách đệ quy, bao gồm tất cả tệp và thư mục con bên trong.
-P scp -P chỉ định cổng SSH trên máy chủ đích, thay thế cổng mặc định 22.
-p scp -p giữ nguyên thời gian sửa đổi, thời gian truy cập và quyền của tệp gốc sau khi sao chép.
-i scp -i chỉ định tệp khóa riêng tư dùng để xác thực thay cho mật khẩu.
-l scp -l giới hạn băng thông sử dụng trong quá trình truyền tải, tính theo đơn vị Kbit/s.
-C scp -C bật nén dữ liệu trong quá trình truyền tải, giúp tăng tốc độ trên đường truyền chậm.
-q scp -q tắt hiển thị thanh tiến trình và các thông báo trong quá trình sao chép.
-v scp -v hiển thị thông tin gỡ lỗi chi tiết về quá trình kết nối và truyền tải.
-3 scp -3 truyền tệp giữa hai máy chủ từ xa thông qua máy cục bộ làm trung gian, thay vì kết nối trực tiếp giữa hai máy chủ.
-o scp -o truyền tùy chọn cấu hình trực tiếp đến SSH, sử dụng cú pháp tương tự tệp ssh_config.
-F scp -F chỉ định tệp cấu hình SSH tùy chỉnh thay cho tệp mặc định của người dùng.
-S scp -S chỉ định chương trình thay thế để thiết lập kết nối mã hóa, thay cho ssh mặc định.
-4 scp -4 ép buộc scp chỉ sử dụng địa chỉ IPv4 trong quá trình kết nối.
-6 scp -6 ép buộc scp chỉ sử dụng địa chỉ IPv6 trong quá trình kết nối.
-B scp -B chạy ở chế độ batch, tắt yêu cầu nhập mật khẩu hoặc cụm mật khẩu trong quá trình thực thi.
-J scp -J kết nối đến máy chủ đích thông qua một máy chủ nhảy (jump host) trung gian.

xem thêm: Networking and Communication

Sử dụng lệnh scp như thế nào trong các tình huống thực tế?

Dưới đây là các kịch bản sử dụng scp phổ biến mà quản trị viên hệ thống thường xuyên gặp phải trong quá trình quản lý máy chủ và triển khai ứng dụng.

scp là gì? [Sao chép file cục bộ lên máy chủ]

scp local_file.txt username@remote_host:/home/username/
local_file.txt 100% 1024 1.0KB/s 00:01

Lệnh này thực hiện đẩy một tệp tin từ máy cá nhân lên thư mục chỉ định trên máy chủ từ xa. Trong thực tế, đây là cách nhanh nhất để upload các tệp cấu hình hoặc script lên server.

scp -r là gì? [Sao chép toàn bộ thư mục]

scp -r /var/www/html user@192.168.1.10:/tmp/backup
html directory 100% 256KB/s 00:05

Tham số -r cho phép sao chép đệ quy toàn bộ thư mục bao gồm tất cả các tệp và thư mục con bên trong. Trên môi trường production, lệnh này thường dùng để backup các mã nguồn website hoặc các thư mục chứa dữ liệu lớn.

scp -P là gì? [Sao chép qua cổng SSH tùy chỉnh]

scp -P 2222 config.conf admin@remote_host:/etc/myapp/
config.conf 100% 512B/s 00:00

Tham số -P dùng để chỉ định cổng SSH khác với cổng 22 mặc định. Trong các hệ thống được bảo mật cao, việc đổi cổng SSH là bắt buộc, do đó kỹ sư DevOps cần sử dụng tùy chọn này để duy trì kết nối.

scp -i là gì? [Sử dụng khóa riêng để xác thực]

scp -i ~/.ssh/id_rsa backup.sql root@server:/backups/
backup.sql 100% 2MB/s 00:10

Tham số -i cho phép chỉ định đường dẫn đến tệp khóa riêng (private key) để xác thực thay vì dùng mật khẩu. Đây là phương thức tiêu chuẩn trong các quy trình tự động hóa (automation) và quản lý hạ tầng đám mây để đảm bảo tính bảo mật.

scp -C là gì? [Sao chép tệp qua đường truyền nén]

scp -C large_database.sql user@remote_host:/data/
large_database.sql 100% 15MB/s 00:45

Tham số -C kích hoạt tính năng nén dữ liệu trong quá trình truyền tải. Trong các tình huống truyền tải tệp log hoặc tệp cơ sở dữ liệu có dung lượng lớn qua mạng Internet có băng thông hạn chế, tùy chọn này giúp rút ngắn đáng kể thời gian hoàn thành.

Tại sao lệnh scp không hoạt động hoặc gặp lỗi khi truyền file?

Trong quá trình triển khai thực tế, người dùng thường gặp các trở ngại liên quan đến quyền truy cập, cấu hình mạng hoặc thiết lập SSH khi sử dụng lệnh scp.

Lỗi từ chối truy cập do sai thông tin đăng nhập

scp file.txt user@192.168.1.10:/home/user/
user@192.168.1.10's password: password123
scp: Permission denied

Lệnh thất bại do sai mật khẩu hoặc tên người dùng không tồn tại trên máy chủ đích.

Lỗi không thể kết nối đến máy chủ đích

scp file.txt user@10.0.0.5:/tmp/
ssh: connect to host 10.0.0.5 port 22: Connection timed out
scp: error: recv failed: Connection timed out

Lệnh không thể thiết lập kết nối do máy chủ đích không phản hồi, có thể do sai địa chỉ IP hoặc bị chặn bởi tường lửa.

Lỗi không có quyền ghi vào thư mục đích

scp config.conf root@remote-server:/etc/
root@remote-server's password:
scp: /etc/config.conf: Permission denied

Lệnh kết thúc với lỗi vì người dùng đăng nhập không có quyền ghi dữ liệu trực tiếp vào thư mục hệ thống trên máy chủ đích.

Lỗi cổng SSH không phải mặc định

scp file.txt user@192.168.1.20:/home/user/
ssh: connect to host 192.168.1.20 port 22: Connection refused

Lệnh không kết nối được do máy chủ đích cấu hình SSH chạy trên một cổng tùy chỉnh thay vì cổng 22 mặc định.

Quy trình thực tế dùng scp trong quản trị hệ thống Linux?

Trong kịch bản triển khai một ứng dụng web lên máy chủ production, scp đóng vai trò là công cụ trung gian để chuyển các tệp tin mã nguồn và cấu hình từ máy trạm cá nhân lên server.

Bước 1: Kiểm tra kết nối và thông tin máy chủ đích

ping 192.168.1.100
PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.045 ms

Việc xác nhận máy chủ đích đang hoạt động giúp đảm bảo quá trình truyền tải tệp không bị gián đoạn do lỗi kết nối mạng.

Bước 2: Chuyển tệp cấu hình từ máy cục bộ lên server

scp config.yaml user@192.168.1.100:/var/www/app/
config.yaml                 100%   45kB   12.5kB/s   00:00

Lệnh này cho phép bạn đẩy tệp tin cấu hình cụ thể vào thư mục đích trên máy chủ từ xa thông qua giao thức SSH.

Bước 3: Sao chép toàn bộ thư mục mã nguồn lên server

scp -r ./src user@192.168.1.100:/var/www/app/
src                          100%   2.4MB    1.1MB/s   00:02

Sử dụng tham số -r cho phép thực hiện sao chép đệ quy toàn bộ thư mục chứa mã nguồn cùng các thư mục con bên trong.

Bước 4: Tải tệp nhật ký (log) từ server về máy cục bộ để kiểm tra

scp user@192.168.1.100:/var/log/app.log ./logs/
app.log                      100%   1.2MB    500kB/s    00:02

Sau khi ứng dụng chạy, lệnh này hỗ trợ bạn lấy các tệp nhật ký từ máy chủ về máy cá nhân để thực hiện phân tích lỗi hoặc kiểm tra hệ thống.

Việc sử dụng lệnh scp trên môi trường VPS đòi hỏi sự chính xác về cấu trúc đường dẫn và quyền truy cập. Khi thực hiện sao chép thư mục, thiếu tham số -r dẫn đến lỗi "not a regular file". Ví dụ, lệnh scp -r /local/path user@vps_ip:/remote/path cho phép truyền toàn bộ thư mục thay vì chỉ một tệp đơn lẻ. Trong các trường hợp quản trị VPS từ xa, lỗi "Permission denied" thường xuất phát từ việc người dùng không có quyền ghi tại thư mục đích hoặc cấu hình SSH Key không khớp. Việc kiểm tra quyền sở hữu thư mục bằng lệnh ls -l trước khi chạy scp giúp ngăn chặn lỗi gián đoạn quá trình truyền tải dữ liệu. Ngoài ra, đối với các tệp tin lớn, việc ngắt kết nối đột ngột sẽ khiến quá trình scp dừng lại mà không có cơ chế tự động tiếp tục. Người quản trị cần lưu ý về băng thông mạng để tránh ảnh hưởng đến hiệu suất hoạt động của các dịch vụ khác trên VPS.

Những câu hỏi thường gặp về lệnh scp?

Dưới đây là các tình huống và thắc mắc phổ biến nhất khi người dùng thực hiện sao chép dữ liệu qua giao thức SSH bằng lệnh scp.

Làm thế nào để sao chép một tệp tin từ máy cục bộ lên máy chủ từ xa?

Bạn sử dụng cú pháp scp theo sau là đường dẫn tệp tin nguồn và thông tin đăng nhập của máy chủ đích.

scp file.txt username@remote_host:/path/to/destination/
file.txt100%

Làm thế nào để tải một tệp tin từ máy chủ từ xa về máy cục bộ?

Bạn đảo ngược thứ tự giữa nguồn và đích, trong đó nguồn là đường dẫn tệp trên máy chủ từ xa.

scp username@remote_host:/path/to/remote_file.txt /local/directory/
remote_file.txt100%

Làm thế nào để sao chép toàn bộ một thư mục từ máy này sang máy khác?

scp -r /local/directory username@remote_host:/remote/path/
directory100%

Cách thực hiện sao chép nếu máy chủ từ xa sử dụng cổng SSH không phải mặc định (22)?

Bạn cần sử dụng tham số -P (chữ P viết hoa) để chỉ định cổng kết nối cụ thể.

scp -P 2222 file.txt username@remote_host:/destination/
file.txt100%

Làm thế nào để sao chép tệp tin mà không làm mất các thuộc tính như thời gian sửa đổi và quyền truy cập?

Tham số -p cho phép bảo toàn các thuộc tính gốc của tệp tin trong quá trình truyền tải.

scp -p file.txt username@remote_host:/destination/
file.txt100%

Làm thế nào để nén dữ liệu trong quá trình truyền tải để tăng tốc độ?

Sử dụng tham số -C để kích hoạt tính năng nén dữ liệu qua luồng truyền tải.

scp -C large_file.zip username@remote_host:/destination/
large_file.zip100%

Lệnh scp là một công cụ mạnh mẽ giúp bạn sao chép dữ liệu giữa các máy chủ trong mạng một cách an toàn thông qua giao thức SSH. Việc làm chủ các tham số như -r để sao chép toàn bộ thư mục hay -P để tùy chỉnh cổng kết nối sẽ giúp quy trình quản trị hệ thống của bạn trở nên vô cùng linh hoạt, đúng không nhỉ? Tất nhiên, việc nắm vững các tùy chọn này có thể giúp bạn tiết kiệm rất nhiều thời gian khi cần chuyển đổi dữ liệu lớn giữa các máy chủ từ xa. Hy vọng những chia sẻ trên sẽ giúp ích cho công việc của bạn. Chúc bạn thành công!