Lệnh scp: cách dùng và tùy chọn, sao chép thư mục và chỉ định cổng

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8OpenSSH 9.9p1Phía nhận Debian 12 · OpenSSH 9.2p1Tài khoản rootKiểm tra ngày 2026-10-28

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.

🧭 Hướng sao chép của scp và đường dẫn từ xa
Sơ đồ giải thích
↔️ Hướng sao chép
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
nguồn💻 Máy chủ chạy lệnhreport.txt
➜
đích🖥️ Máy chủ từ xa203.0.113.10:~/scp-test/
nguồn🖥️ Máy chủ từ xa203.0.113.10:~/scp-test/report.txt
➜
đích💻 Máy chủ chạy lệnh./downloads/
nguồn🖥️ Máy chủ từ xa A203.0.113.10:~/scp-test/report.txt
➜
Trung chuyển💻 Máy chủ chạy lệnh-3
➜
đích🖥️ Máy chủ từ xa B198.51.100.20:~/scp-test/
🧩 Dạng đường dẫn từ xa
user tài khoản dùng để kết nối, 203.0.113.10 địa chỉ máy chủ hoặc tên miền, :~/scp-test/ và sau dấu hai chấm là đường dẫn trên máy chủ đó (dấu ngã là thư mục home)
Nếu viết tệp cục bộ trước và đường dẫn từ xa sau thì đó là gửi. Nếu đường dẫn sau dấu hai chấm kết thúc bằng dấu gạch chéo, tệp được lưu trong thư mục đó với cùng tên.
Nếu viết đường dẫn từ xa trước thì đó là nhận. Tệp nhận được nằm ở đường dẫn cục bộ viết phía sau.
Khi cả nguồn và đích đều là máy chủ từ xa, từ OpenSSH 8.7 dữ liệu đi qua máy chủ chạy lệnh. Đây là cùng cách với khi thêm -3.

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:00

Khi 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:00

Nế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.txt
report.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.

Trình mô phỏng lệnh scpOpenSSH 9.9
[root@server work]#
Chỉ chạy trong trình duyệt. Xem các tệp phía từ xa ở danh sách bên trái và dùng ↑↓ để gọi lại lệnh đã nhập.

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.gz
backup.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ệnhFileThời gian chạyTốc độ hiển thị tiến độ
scp backup.tar.gz20MB0,68 giây53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82 giây996.5KB/s
scp access.log (3 lần)19MB0.79~0.89 giây—
scp -C access.log (3 lần)19MB0.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 seconds

Dò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ọnChức năngKết quả trong bài này
-PChỉ định cổng kết nối SSHCổng 22 gửi xong report.txt, cổng 2222 không mở kết thúc bằng [Connection timed out]
-iChỉ định tệp khóa riêng dùng cho xác thực khóa công khaiChỉ định ~/.ssh/id_ed25519 và gửi xong report.txt
-rSao chép tệp và thư mục con trong thư mụcPhí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]
-pGiữ nguyên thời gian sửa đổi, thời gian truy cập và quyền của nguồnThờ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
-CNén dữ liệu trên kết nối SSHVớ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/sVới -l 8000, 20MB ở 996.5KB/s, 20.82 giây
-vIn quá trình từ kết nối đến truyền thành các dòng debug1Xác nhận truyền SFTP qua dòng [Sending subsystem: sftp]
-3Truyề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
-OTruyề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
-oChuyể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ọnChức năng
-qTắt hiển thị tiến độ cùng cảnh báo và thông báo chẩn đoán của ssh
-JKế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)
-FChỉ đị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)
-4Buộc chỉ dùng địa chỉ IPv4
-6Buộ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.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh 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.txt

report-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:00

Nế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_ed25519

Tê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:00

Giố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ụcscprsync
Phạm vi truyềnToàn bộ tệp đã chỉ định mỗi lần chạyChỉ 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ốcGiữ nguyên liên kết với -a
Yêu cầu ở phía nhậnTruy cập SSH và máy chủ SFTPCà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 directory

Khi 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 closed

Khi 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:00

Khi 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 target

Lú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:00

Nế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.txt
report.txt                                    100%   14     5.6KB/s   00:00

Tà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

Nếu có tệp cùng tên, tệp đó bị ghi đè bằng tệp mới mà không hỏi xác nhận. Khi gửi cùng report.txt vào cùng thư mục nhiều lần, mỗi lần đều truyền mà không hỏi. Vì vậy, với tệp cần giữ lại, hãy gửi với tên khác ở cuối đường dẫn đích.

Nếu đặt * trong đường dẫn từ xa và bọc bằng dấu nháy đơn, tất cả tệp có tên khớp trên máy chủ từ xa sẽ được nhận. Khi nhận report-*.txt từ máy chủ từ xa, sáu tệp có tên khớp được truyền lần lượt. Dấu nháy giúp shell của máy chủ chạy lệnh không diễn giải * trước.

Khi thêm -B, scp chạy ở chế độ batch, không hỏi mật khẩu hay cụm mật khẩu. Theo tài liệu chính thức, chế độ này không nhập được mật khẩu, nên với tác vụ tự động như cron, hãy thiết lập xác thực bằng khóa trước.

🧭 Nội dung đề xuất về lệnh mạng 13 bài viết · 2 tài liệu tham khảo
🗂️ Lệnh mạng
📄 Lệnh ip 📄 Lệnh netstat · ifconfig 📄 Lệnh nmtui
📄 Lệnh SSH 📄 Lệnh rsync 📄 Lệnh wget 📄 Lệnh rz · sz 📄 Lệnh scp
📄 Lệnh host 📄 Lệnh nslookup
📄 Lệnh iptables 📄 Lệnh firewall-cmd 📄 Lệnh certbot

ℹ️ 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á.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 0   +   10   =