Lệnh scp: cách dùng và tùy chọn, sao chép thư mục và chỉ định cổng
scp là công cụ sao chép dùng để trao đổi tệp với máy chủ mà bạn kết nối qua SSH. Khi gửi tệp bằng lệnh scp, bạn viết nguồn trước và đích sau, giống như với cp. Khi chúng tôi gửi tệp và thư mục từ máy chủ AlmaLinux 9 sang máy chủ Debian 12 rồi tải về lại, quá trình truyền diễn ra qua giao thức SFTP và một tệp 20MB đến nơi trong chưa đầy 1 giây.
Toàn bộ đầu ra bên dưới là kết quả nguyên văn khi chạy scp của OpenSSH 9.9 bằng tài khoản root ở phía gửi. Chỉ địa chỉ máy chủ và tên tài khoản được đổi thành giá trị ví dụ.
1️⃣ Cách dùng scp và đường dẫn từ xa
Trước đường dẫn trên máy chủ từ xa, hãy thêm [tài khoản@địa chỉ máy chủ:]. Đường dẫn không có dấu hai chấm được hiểu là đường dẫn trên máy chủ chạy lệnh, nên phía có dấu hai chấm quyết định bạn đang gửi hay nhận.
Gửi report.txt từ thư mục hiện tại đến thư mục scp-test trong thư mục home của máy chủ từ xa.
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00Khi truyền xong, tên tệp, tiến độ, kích thước, tốc độ và thời gian thực hiện hiện trên một dòng. Phần hiển thị tiến độ này chỉ xuất hiện khi chạy trong terminal. Vì vậy, nếu chuyển hướng đầu ra vào tệp thì tệp đó không có gì.
Khi tải về, hãy viết đường dẫn từ xa trước và đường dẫn cục bộ để lưu ở sau.
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00Nếu đường dẫn đích kết thúc bằng tên tệp thay vì thư mục, tệp được lưu với tên đó. Sau khi gửi bằng lệnh bên dưới, trong thư mục phía nhận report.txt mang tên report-1028.txt.
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 Trình mô phỏng lệnh scp
Trong trình mô phỏng bên dưới, bạn có thể tự nhập lệnh gửi, nhận và sao chép thư mục để xem đầu ra của từng tùy chọn.
2️⃣ Tùy chọn của lệnh scp
Tùy chọn viết ngay sau scp, trước nguồn. -P chỉ định cổng là chữ hoa, còn -p chữ thường giữ nguyên thời gian và quyền, nên nhập nhầm chữ hoa thường sẽ thực hiện thao tác khác.
-l đặt giới hạn trên của tốc độ truyền theo đơn vị Kbit/s. Khi không có tùy chọn, tệp 20MB truyền xong trong chưa đầy 1 giây.
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 tương đương khoảng 1,000KB mỗi giây. Khi gửi cùng tệp với -l 8000, tốc độ trong phần hiển thị tiến độ là 996.5KB/s và quá trình truyền mất 20 giây.
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C nén dữ liệu trên kết nối SSH theo cùng cách với gzip. Khi gửi mỗi cách ba lần một tệp nhật ký 19MB có các câu lặp lại, giữa hai máy chủ này cách dùng -C chậm hơn một chút.
| Lệnh | File | Thời gian chạy | Tốc độ hiển thị tiến độ |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0,68 giây | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 giây | 996.5KB/s |
| scp access.log (3 lần) | 19MB | 0.79~0.89 giây | — |
| scp -C access.log (3 lần) | 19MB | 0.84~0.97 giây | — |
Thời gian chạy là thời gian từ khi bắt đầu lệnh, kết nối đến khi truyền xong. Tài liệu ssh cũng giải thích rằng nén có tác dụng trên đường truyền chậm và làm chậm việc truyền trên mạng nhanh.
-v in quá trình từ kết nối đến truyền thành các dòng debug1, nên được dùng để tìm nguyên nhân khi không kết nối được hoặc dừng ở bước xác thực. Đầu ra dài nên chúng tôi chỉ lọc các dòng xác thực và truyền bằng grep.
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 secondsDòng [Sending subsystem: sftp] nghĩa là scp đã gửi tệp bằng giao thức SFTP. Từ OpenSSH 9.0, scp mặc định dùng SFTP. Nếu thêm -O, việc truyền dùng giao thức SCP cũ và cùng vị trí đó sẽ hiện [Sending command: scp -v -t].
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 Tùy chọn chính: kết quả chạy trong bài này
| Tùy chọn | Chức năng | Kết quả trong bài này | |
|---|---|---|---|
| -P | Chỉ định cổng kết nối SSH | Cổng 22 gửi xong report.txt, cổng 2222 không mở kết thúc bằng [Connection timed out] | |
| -i | Chỉ định tệp khóa riêng dùng cho xác thực khóa công khai | Chỉ định ~/.ssh/id_ed25519 và gửi xong report.txt | |
| -r | Sao chép tệp và thư mục con trong thư mục | Phía nhận có thư mục css và images theo cấu trúc gốc; bỏ tùy chọn thì không truyền được do lỗi [not a regular file] | |
| -p | Giữ nguyên thời gian sửa đổi, thời gian truy cập và quyền của nguồn | Thời gian sửa đổi được giữ nguyên; ở phía nhận của bài này, quyền 600 chỉ được giữ ở tệp gửi bằng -O -p | |
| -C | Nén dữ liệu trên kết nối SSH | Với nhật ký 19MB giữa hai máy chủ của bài này, cách có tùy chọn chậm hơn một chút | |
| -l | Đặt giới hạn trên của tốc độ truyền theo đơn vị Kbit/s | Với -l 8000, 20MB ở 996.5KB/s, 20.82 giây | |
| -v | In quá trình từ kết nối đến truyền thành các dòng debug1 | Xác nhận truyền SFTP qua dòng [Sending subsystem: sftp] | |
| -3 | Truyền dữ liệu giữa hai máy chủ từ xa qua máy chủ chạy lệnh (mặc định từ OpenSSH 8.7) | Gửi xong report.txt với hai thư mục trên cùng máy chủ làm nguồn và đích | |
| -O | Truyền bằng giao thức SCP cũ | Đầu ra -v hiện [Sending command: scp -v -t]; đường dẫn có khoảng trắng cần thêm dấu gạch chéo ngược | |
| -o | Chuyển tùy chọn dạng ssh_config cho ssh | Đặt thời gian chờ 10 giây bằng ConnectTimeout=10 và xác nhận [Connection timed out] |
📎 Tùy chọn khác: theo tài liệu hướng dẫn chính thức
| Tùy chọn | Chức năng | |
|---|---|---|
| -q | Tắt hiển thị tiến độ cùng cảnh báo và thông báo chẩn đoán của ssh | |
| -J | Kết nối trước đến jump host rồi từ đó thiết lập chuyển tiếp TCP đến đích cuối (cách viết ngắn của thiết lập ProxyJump, nhiều chặng cách nhau bằng dấu phẩy) | |
| -F | Chỉ định tệp khác làm tệp cấu hình theo người dùng của ssh (chuyển thẳng cho ssh) | |
| -4 | Buộc chỉ dùng địa chỉ IPv4 | |
| -6 | Buộc chỉ dùng địa chỉ IPv6 |
3️⃣ Sao chép thư mục bằng scp và giữ nguyên thời gian
Nếu chỉ định thư mục mà không có tùy chọn, scp in lỗi cho biết đó không phải tệp thông thường và không thực hiện truyền.
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/Khi thêm -r, tệp và thư mục con trong thư mục sẽ được sao chép.
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00Đầu ra chỉ hiện tên tệp. Trong đầu ra find ở phía nhận, các thư mục css và images nằm dưới site-files theo cấu trúc gốc.
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r đi theo liên kết tượng trưng trong thư mục và sao chép tệp gốc, nên với thư mục cần giữ nguyên liên kết thì nên dùng rsync -a.
-p giữ nguyên thời gian sửa đổi, thời gian truy cập và quyền của nguồn. Trước khi gửi, chúng tôi đặt thời gian sửa đổi của report.txt gốc là 00:00 (UTC) ngày 1 tháng 10 năm 2026 và quyền là 600. Múi giờ của máy chủ phía nhận là UTC nên ls ở phía gửi cũng được in với TZ=UTC.
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txtreport-p.txt gửi bằng -p và report-Op.txt gửi bằng -O -p giữ nguyên thời gian gốc, còn report.txt gửi không có tùy chọn được lưu theo thời gian gửi. Trên máy chủ phía nhận, tệp gửi qua SFTP được lưu với quyền 664 dù có -p, và chỉ tệp gửi bằng giao thức SCP cũ (-O) giữ được 600.
Vì vậy, với tệp cần có quyền giống nguồn, sau khi gửi hãy kiểm tra quyền bằng ls -l ở phía nhận.
4️⃣ Chỉ định cổng và tệp khóa trong scp
Với máy chủ không kết nối được bằng cổng mặc định 22 và khóa mặc định, hãy tự chỉ định cổng và khóa trước khi gửi. -P chỉ định cổng kết nối SSH, -i chỉ định tệp khóa riêng dùng cho xác thực khóa công khai.
Bên dưới là ví dụ chỉ định trực tiếp cổng 22 và tệp khóa. Nếu máy chủ đã đổi cổng, hãy viết số đó thay cho 22.
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00Nếu chạy không có -i, giống như ssh, scp lần lượt dùng các khóa có tên mặc định trong ~/.ssh (id_rsa, id_ecdsa, id_ed25519, v.v.).
Nếu thường gửi đến cùng một máy chủ, hãy viết bí danh trong ~/.ssh/config và trong scp chỉ cần nhập bí danh.
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519Tên ở dòng Host trở thành bí danh, và bốn dòng bên dưới thay cho địa chỉ máy chủ, tài khoản, cổng và tệp khóa. Lệnh chỉ viết bí danh cũng kết thúc với cùng kết quả một dòng như khi viết đủ địa chỉ và khóa.
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P, -i và bí danh đều dùng nguyên thiết lập kết nối ssh, nên quá trình tạo khóa và đăng ký lên máy chủ cũng giống như khi kết nối bằng lệnh SSH.
5️⃣ Sao chép giữa các máy chủ bằng scp
Ngay cả khi nguồn và đích đều là máy chủ từ xa, bạn vẫn sao chép được bằng một dòng scp. Từ OpenSSH 8.7, dữ liệu được truyền qua máy chủ chạy lệnh, và cách này chính là -3. Ghi chú phát hành chính thức nêu lý do đổi thành mặc định là không cần đặt thông tin xác thực của máy chủ đích trên máy chủ nguồn.
Phép đo bên dưới chạy với hai thư mục trên cùng máy chủ làm nguồn và đích. Nếu máy chủ đích khác, chỉ cần đổi tài khoản và địa chỉ ở phía sau.
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00Giống như trụ sở chính nhận giấy tờ giữa hai chi nhánh rồi gửi tiếp.
Cách cũ, trong đó máy chủ nguồn gửi trực tiếp đến máy chủ đích, được chỉ định bằng -R. Cách này yêu cầu máy chủ nguồn kết nối được đến máy chủ đích mà không cần mật khẩu. Từ OpenSSH 10.6, dùng -R sẽ hiện cảnh báo sắp ngừng hỗ trợ, và các phiên bản sau dự kiến bỏ qua tùy chọn này rồi sao chép theo cách -3.
6️⃣ So sánh scp và rsync
Gửi vài tệp một lần thì scp là đủ, còn việc đồng bộ lặp lại cùng một thư mục hoặc tiếp tục lượt truyền bị ngắt thì nên dùng lệnh rsync. scp gửi lại toàn bộ tệp đã chỉ định mỗi lần chạy, còn rsync so sánh nguồn với đích và chỉ truyền các tệp đã thay đổi.
| Hạng mục | scp | rsync |
|---|---|---|
| Phạm vi truyền | Toàn bộ tệp đã chỉ định mỗi lần chạy | Chỉ tệp đã thay đổi so với nguồn |
| Giữ tệp nhận dở (--partial) | ❌ | ✅ |
| Xóa tệp không có ở nguồn (--delete) | ❌ | ✅ |
| Liên kết tượng trưng | Đi theo và sao chép tệp gốc | Giữ nguyên liên kết với -a |
| Yêu cầu ở phía nhận | Truy cập SSH và máy chủ SFTP | Cài rsync ở cả hai phía |
7️⃣ Thông báo lỗi của lệnh scp và cách khắc phục
Khi scp thất bại, nguyên nhân hiện ngay ở dòng đầu của đầu ra. Trong cả ba trường hợp chúng tôi cố ý gây lỗi bằng tệp không tồn tại, quyền ghi và cổng sai, nguyên nhân đều ở dòng đầu, và mã thoát cũng đều khác 0.
🔲 No such file or directory
Nếu cố nhận một tệp không có ở phía từ xa, [No such file or directory] sẽ hiện cùng đường dẫn.
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directoryKhi gửi, nếu thư mục đích không tồn tại cũng có cùng lỗi. scp không tạo thư mục còn thiếu, nên hãy chạy mkdir -p qua ssh trước để tạo thư mục.
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
Nếu thư mục phía nhận không có quyền ghi, [Permission denied] sẽ theo sau [dest open]. Bên dưới là kết quả gửi đến thư mục readonly có quyền 555.
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/Nếu trước [Permission denied] có [tài khoản@địa chỉ máy chủ:] và trong ngoặc có phương thức xác thực như publickey thì kết nối đã bị từ chối ở bước xác thực. Dòng này là định dạng mà chương trình ssh đưa ra khi xác thực thất bại, nên hãy kiểm tra trước tệp khóa chỉ định bằng -i và khóa công khai đã đăng ký trên máy chủ.
🔲 Connection timed out
Nếu số cổng sai hoặc tường lửa chặn cổng đó nên không có phản hồi, scp chờ kết nối rồi kết thúc bằng [Connection timed out]. Bên dưới là kết quả gửi đến cổng 2222 không mở với thời gian chờ 10 giây.
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closedKhi gặp lỗi này, trước tiên hãy kiểm tra số ghi ở -P có trùng với cổng SSH của máy chủ không.
🔲 Khoảng trắng và dấu ngã (~) trong đường dẫn
Với scp hiện nay truyền qua SFTP, chỉ cần bọc đường dẫn từ xa có khoảng trắng trong dấu nháy đơn một lần.
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00Khi thêm -O vào cùng lệnh để gửi bằng giao thức SCP cũ, lệnh thất bại với [ambiguous target]. Lý do là trong giao thức SCP cũ, shell từ xa diễn giải đường dẫn thêm một lần nữa.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous targetLúc này, hãy đặt dấu gạch chéo ngược trước khoảng trắng để shell từ xa cũng đọc thành một từ.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00Nếu đường dẫn sau dấu hai chấm bắt đầu không có dấu gạch chéo hay dấu ngã, nó được xử lý theo thư mục home của tài khoản từ xa.
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00Tài liệu chính thức hướng dẫn dùng -O khi máy chủ SFTP cũ không đổi được đường dẫn bắt đầu bằng dấu ngã thành thư mục home. Lúc này, viết đường dẫn theo home không có dấu ngã như trên cũng lưu vào cùng chỗ.
🔢 FAQ & nội dung đề xuất









ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.
