RDP Monster

Lệnh scp trên Linux: sao chép tệp lên và xuống VPS (rsync, sftp)

Lệnh scp trên Linux: sao chép tệp lên và xuống VPS (rsync, sftp)

Lệnh scp trên Linux: cú pháp và các thao tác truyền tệp cơ bản

scp (secure copy, sao chép an toàn) sao chép tệp giữa các máy qua SSH, nên người dùng, khóa và cổng nào dùng được cho ssh thì cũng dùng được cho scp. Dạng lệnh luôn là scp [options] SOURCE DESTINATION, và phía nào ở xa thì được viết là user@host:path. Lệnh cần một phiên đăng nhập SSH hoạt động; nếu cổng 22 chưa phản hồi, trước tiên hãy bật SSH trên Ubuntu và gia cố bảo mật.

1. Từ máy cục bộ lên máy chủ (tải lên)

scp backup.tar.gz user@SERVER_IP:/home/user/
scp backup.tar.gz user@SERVER_IP:~/backups/renamed.tar.gz
scp *.conf user@SERVER_IP:~/nginx-conf/

Đường dẫn kết thúc bằng dấu gạch chéo sẽ đặt tệp vào trong thư mục đó với tên gốc; một đường dẫn đầy đủ sẽ đổi tên tệp khi đến nơi. Có thể liệt kê nhiều tệp cục bộ trước đích, miễn là đích là một thư mục, và thư mục đó phải tồn tại sẵn: scp không tạo thư mục cha.

2. Từ máy chủ về máy cục bộ (tải xuống)

scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/

Dấu chấm nghĩa là "tại đây, giữ nguyên tên". Hãy đặt ký tự đại diện phía máy chủ trong dấu nháy để shell cục bộ không tự mở rộng chúng. Sao chép từ máy chủ sang máy chủ cũng được: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ chuyển dữ liệu qua máy của bạn, nên chỉ máy của bạn cần thông tin đăng nhập cho cả hai máy chủ.

3. Thư mục với -r

scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup

-r sao chép một thư mục và mọi thứ bên trong. Lệnh đầu tạo /var/www/site trên máy chủ; lệnh thứ hai kéo toàn bộ cây nginx về một thư mục cục bộ. Liên kết tượng trưng (symlink) được sao chép thành tệp thường, một lý do khiến rsync là công cụ tốt hơn cho cả cây hệ thống.

Các tùy chọn scp bạn thực sự dùng: -P, -i, -C, -p

scp -P 2222 file.txt user@SERVER_IP:/home/user/        # non-default SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@SERVER_IP:~/     # use a specific key
scp -C dump.sql user@SERVER_IP:~/                       # compress in transit
scp -rp ./site user@SERVER_IP:/var/www/                 # keep times and modes

Tùy chọn cổng viết bằng chữ hoa: -P. -p chữ thường nghĩa là "giữ nguyên thời gian sửa đổi, thời gian truy cập và các bit quyền", và vì chính ssh dùng -p cho cổng, nhầm lẫn hai tùy chọn này là lỗi scp phổ biến nhất. Để khỏi lặp lại cổng và khóa ở mỗi lệnh, hãy khai báo máy chủ một lần trong ~/.ssh/config; scp, rsync và sftp đều đọc tệp này:

Host vps
    HostName SERVER_IP
    User user
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Thêm hai tùy chọn: -l 8000 giới hạn tốc độ truyền ở 8,000 Kbit/s (khoảng 1 MB/s), và -v cho thấy những khóa nào được đưa ra khi xác thực thất bại. Từ OpenSSH 9.0, scp dùng giao thức SFTP bên dưới; cú pháp không đổi, nhưng các thủ thuật shell nhúng trong đường dẫn phía máy chủ (ví dụ thay thế lệnh) không còn chạy trên máy chủ nữa, và -O khôi phục giao thức cũ cho máy chủ rất cũ từ chối chế độ mới.

rsync: bản sao đồng bộ, truyền tiếp được và loại trừ tệp

rsync chỉ sao chép những gì đã thay đổi. Lần chạy đầu hoạt động như scp -r; các lần sau so sánh hai phía và chỉ gửi phần khác biệt: tệp mới, và với tệp đã sửa thì chỉ các khối bị thay đổi. Vì vậy đây là công cụ cho triển khai, sao lưu và mọi thứ dung lượng lớn. rsync phải được cài ở cả hai đầu (sudo apt install rsync); một số image tối giản và container không có sẵn.

1. Lệnh dùng hằng ngày

rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/

-a (archive) tương đương -rlptgoD: đệ quy, giữ symlink là symlink, giữ quyền, thời gian, nhóm, chủ sở hữu và tệp thiết bị; quyền sở hữu chỉ được giữ khi phía nhận chạy với quyền root. -v liệt kê tệp, -z nén, --progress hiển thị tiến trình từng tệp.

Dấu gạch chéo cuối rất quan trọng. ./site/ nghĩa là "nội dung của site"; ./site nghĩa là "chính thư mục đó", và sẽ tạo ra /var/www/site/site. Khi không chắc, hãy thêm -n (--dry-run) và đọc danh sách tệp trước khi có gì được ghi.

2. Đồng bộ với --delete

rsync -avzn --delete ./site/ user@SERVER_IP:/var/www/site/   # dry run first
rsync -avz --delete ./site/ user@SERVER_IP:/var/www/site/

--delete xóa các tệp ở đích không còn tồn tại ở nguồn. Một bản sao đồng bộ thật sự cần nó, và cũng chính nó biến một dấu gạch chéo đặt sai thành một thư mục bị xóa sạch, nên hãy chạy thử mỗi lệnh --delete mới một lần.

3. Loại trừ tệp

rsync -avz --exclude='node_modules/' --exclude='.git/' --exclude='*.log' ./app/ user@SERVER_IP:/srv/app/
rsync -avz --exclude-from='.rsyncignore' ./app/ user@SERVER_IP:/srv/app/

Các mẫu được tính tương đối so với gốc của lần truyền; dấu gạch chéo ở đầu sẽ neo mẫu, nên /config.php chỉ loại trừ tệp ở cấp cao nhất. --exclude-from đọc mỗi dòng một mẫu.

4. Tiếp tục lần truyền dở, cổng và khóa tùy chỉnh

rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/

-P là dạng viết tắt của --partial --progress: nếu kết nối bị ngắt, tệp dở dang được giữ lại và chạy lại đúng lệnh đó sẽ tiếp tục từ chỗ đã dừng. Tùy chọn SSH được truyền qua -e, và ở đây cổng là -p chữ thường vì đó là tùy chọn của ssh, không phải của rsync; một mục Host trong ~/.ssh/config giúp bỏ hẳn chuỗi -e.

sftp: truyền tệp tương tác qua cùng thông tin đăng nhập SSH

sftp cho bạn một dấu nhắc kiểu FTP qua SSH, tiện để duyệt trước khi sao chép.

sftp -P 2222 -i ~/.ssh/id_ed25519 user@SERVER_IP
sftp> ls -l /var/www
sftp> lcd ~/Downloads
sftp> get /var/log/syslog
sftp> put -r ./site /var/www/
sftp> reget backup.iso
sftp> bye

Các lệnh bắt đầu bằng l tác động lên máy của bạn (lcd, lls, lpwd); các lệnh còn lại tác động lên máy chủ. put -r và get -r sao chép thư mục, reget và reput tiếp tục một tệp bị ngắt giữa chừng, và !command chạy một lệnh shell cục bộ mà không rời phiên. sftp -b commands.txt user@SERVER_IP chạy lại một tệp chứa các lệnh này cho tác vụ cron.

Sao chép tệp từ Windows: scp trong PowerShell và WinSCP

Windows 10 (bản 1809 trở lên) và Windows 11 có sẵn OpenSSH client, nên scp, sftp và ssh có trong PowerShell với các tùy chọn giống trên Linux:

cd C:\Users\you\Projects
scp -P 2222 -i $HOME\.ssh\id_ed25519 .\site.zip user@SERVER_IP:/home/user/
scp -r user@SERVER_IP:/var/www/site $HOME\Downloads

Khóa nằm trong C:\Users\you\.ssh\ cạnh known_hosts, và ssh-keygen -R SERVER_IP cũng dùng được ở đó. Dùng đường dẫn tương đối sau một lệnh cd giúp tránh nhầm lẫn giữa ký tự ổ đĩa và tên máy chủ. rsync không đi kèm; cách gọn nhất để có nó là WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.

Nếu cần giao diện đồ họa, WinSCP là lựa chọn thông dụng: nó hỗ trợ SFTP và SCP, có giao diện hai khung kéo thả, và lệnh Synchronize làm gần giống rsync --delete. Nó cần khóa ở định dạng .ppk của PuTTY và đề nghị chuyển đổi khi bạn chọn một khóa OpenSSH. Với những gì triển khai nhiều lần, một dòng scp hoặc rsync trong script dễ kiểm tra và tự động hóa hơn.

scp, rsync hay sftp: nên dùng công cụ nào

Tác vụCông cụ phù hợp nhấtLý do
Một tệp, một lầnscpLệnh ngắn nhất, không cần cài gì
Một thư mục, lần sao chép đầuscp -r hoặc rsync -aKết quả tương đương
Triển khai hoặc sao lưu lặp lạirsyncChỉ gửi dữ liệu đã thay đổi
Đồng bộ có xóa tệprsync --deletescp không thể xóa tệp
Tiếp tục một tệp lớnrsync -P hoặc sftp regetscp bắt đầu lại từ đầu
Duyệt rồi chọn tệpsftp hoặc WinSCPLiệt kê tương tác
Hàng nghìn tệp nhỏrsync hoặc tar qua sshChi phí cho từng tệp lấn át scp
Windows không có WSLscp trong PowerShell hoặc WinSCPKhông có rsync gốc

Nguyên tắc chung: dùng scp khi bạn gõ được lệnh theo trí nhớ, chuyển sang rsync ngay khi bạn sẽ chạy nó lần thứ hai.

Mẹo tăng tốc thực sự hiệu quả

  • Nén không miễn phí. -C (scp) và -z (rsync) thu nhỏ văn bản, bản dump SQL và log, nhưng lãng phí CPU với tarball, hình ảnh và video. Nếu top cho thấy sshd chạm 100% trong lúc truyền, hãy bỏ tùy chọn này.
  • Gộp nhiều tệp nhỏ. Các vòng trao đổi cho từng tệp chiếm phần lớn thời gian khi bạn đẩy một cây mã nguồn; một luồng duy nhất nhanh hơn: tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'.
  • Thử thuật toán mã hóa khác trên đường truyền nhanh. Khi chính tiến trình ssh là nút thắt cổ chai, scp -c aes128-gcm@openssh.com tận dụng các lệnh AES tích hợp trong gần như mọi CPU hiện đại.
  • Bảo vệ các lần truyền dài. Chạy chúng trong tmux hoặc screen để phiên bị ngắt không làm dừng việc sao chép, hoặc dùng rsync -P rồi chạy lại.
  • Kiểm tra và giới hạn băng thông. sha256sum file ở hai đầu phải khớp nhau; scp -l hoặc rsync --bwlimit giúp bản sao lưu không chiếm hết tài nguyên của ứng dụng.

Quyền, quyền sở hữu và các lỗi thường gặp

Permission denied ở đường dẫn đích

scp: /var/www//html/: Permission denied nghĩa là đăng nhập đã thành công nhưng người dùng đó không có quyền ghi vào đó. Hãy sao chép vào thư mục home rồi sudo mv các tệp, cấp quyền sở hữu thư mục đích cho người dùng (sudo chown -R user:user /var/www/site), hoặc với rsync thì thêm --rsync-path="sudo rsync", cách này hoạt động khi người dùng đăng nhập có sudo không cần mật khẩu, như được thiết lập trong bài tạo người dùng có quyền sudo trên Linux. Tải lên bằng root tránh được lỗi nhưng để lại các tệp thuộc sở hữu của root mà máy chủ web không ghi được: hãy chạy sudo chown -R www-data:www-data /var/www/site sau đó.

Permission denied (publickey)

Máy chủ từ chối xác thực. Hãy kiểm tra tên người dùng, chỉ định khóa bằng -i, thêm -v; trên VPS, sudo journalctl -u ssh -n 30 cho biết lý do.

Remote host identification has changed

Đây là điều bình thường sau khi cài lại hệ điều hành hoặc gán lại IP: khóa máy chủ không còn khớp với ~/.ssh/known_hosts. Nếu bạn đúng là đã dựng lại máy chủ, hãy chạy ssh-keygen -R SERVER_IP và kết nối lại. Nếu không, hãy tìm hiểu nguyên nhân trước khi gõ mật khẩu ở bất kỳ đâu.

No such file or directory

scp không tạo thư mục cha: hãy chạy ssh user@SERVER_IP 'mkdir -p /var/www/site' trước. rsync chỉ tạo thành phần thư mục cuối cùng (--mkpath, từ rsync 3.2.3+, tạo cả thư mục cha).

rsync: command not found, hoặc protocol data stream (code 12)

Một trong hai phía thiếu rsync; hãy chạy sudo apt install rsync ở phía đó rồi thử lại.

Script đã tải lên nhưng không chịu chạy

Tệp đến từ Windows không có bit thực thi và thường mang ký tự xuống dòng CRLF, gây ra lỗi bad interpreter: No such file or directory. Sửa cả hai bằng chmod +x deploy.sh và sed -i 's/\r$//' deploy.sh; phần shebang được giải thích trong bài tệp .sh là gì và bash chạy nó như thế nào. Một lỗi kinh điển cuối cùng: scp file.txt user@SERVER_IP thiếu dấu hai chấm sau tên máy chủ là một lệnh sao chép cục bộ, lặng lẽ tạo ra một tệp tên là user@SERVER_IP.

Tất cả những điều trên giả định một máy chủ bạn truy cập qua SSH bằng root hoặc một người dùng sudo, nơi giới hạn là chính lần truyền chứ không phải hạn mức dung lượng. Một VPS Linux của rdp.monster chính là loại máy như vậy: toàn quyền root, CPU và RAM riêng, băng thông không giới hạn (sử dụng hợp lý), không cần KYC, chấp nhận tiền mã hóa, từ $8.99 mỗi tháng, và máy chủ hoạt động khoảng 10 giây sau khi thanh toán được xác nhận, nên lệnh đầu tiên bạn chạy trên đó có thể là lệnh scp ở bước một.

Câu hỏi thường gặp

Lệnh scp có bị khai tử không?

scp chưa bị gỡ bỏ, nhưng từ OpenSSH 9.0 nó truyền dữ liệu qua giao thức SFTP vì giao thức scp gốc đã bị coi là lỗi thời.
Các nhà phát triển OpenSSH mô tả giao thức scp/rcp gốc là lỗi thời và khó bảo mật, và từ OpenSSH 9.0 (2022), lệnh scp truyền tệp qua SFTP thay vào đó. Lệnh, các tùy chọn và cú pháp user@host:path không đổi, nên các script hiện có vẫn chạy được; chỉ việc mở rộng shell bên trong đường dẫn phía máy chủ hoạt động khác đi, và -O khôi phục giao thức cũ cho những máy chủ cần đến nó. Với tự động hóa mới, rsync hoặc sftp là lựa chọn mạnh hơn, nhưng bản thân scp vẫn ổn cho các lần sao chép đơn lẻ.

Có thể dùng scp với mật khẩu thay vì khóa SSH không?

Có, nếu máy chủ vẫn cho phép xác thực bằng mật khẩu; scp hỏi mật khẩu giống hệt ssh.
scp dùng bất kỳ phương thức xác thực nào mà ssh sẽ dùng cho máy chủ đó. Nếu sshd có PasswordAuthentication yes, scp hỏi mật khẩu và việc sao chép tiếp tục; không có tùy chọn nào để truyền mật khẩu trên dòng lệnh, và những công cụ làm được việc đó như sshpass sẽ để lại mật khẩu trong lịch sử shell. Máy chủ đã gia cố thường tắt đăng nhập bằng mật khẩu, khi đó scp báo lỗi Permission denied (publickey) cho đến khi bạn cài khóa bằng ssh-copy-id. Khóa cũng là thứ giúp script chạy không cần người giám sát.

scp có ghi đè tệp hiện có mà không hỏi không?

Có: cả scp và rsync đều lặng lẽ thay thế tệp ở đích, nên hãy xem trước bằng rsync --dry-run khi không chắc.
scp ghi đè mọi tệp cùng tên ở đích mà không hỏi và không có tùy chọn bỏ qua. rsync cũng ghi đè, nhưng chỉ khi nguồn khác đi, và cho bạn quyền kiểm soát: -n (--dry-run) in ra những gì sẽ thay đổi, --ignore-existing giữ nguyên các tệp đã tồn tại, --update bỏ qua các tệp mới hơn ở đích, và --backup --backup-dir=DIR giữ lại các phiên bản bị thay thế. Với dữ liệu không thể thay thế, hãy sao chép vào một thư mục mới rồi hoán đổi sau.

Làm sao sao chép tệp trực tiếp giữa hai máy chủ VPS?

Hoặc chạy rsync hay scp trên một máy chủ nhắm tới máy kia, hoặc dùng scp -3 để chuyển dữ liệu qua máy của bạn.
Cách nhanh nhất là từ máy chủ sang máy chủ: ssh vào VPS nguồn và chạy rsync -avz /data/ user@OTHER_IP:/data/ (hoặc scp -r) để dữ liệu không bao giờ đi qua kết nối mạng ở nhà bạn. Cách này yêu cầu máy chủ thứ nhất giữ một khóa mà máy chủ thứ hai chấp nhận. Nếu bạn không muốn đặt khóa trên máy chủ, scp -3 user@HOST_A:/path user@HOST_B:/path sao chép qua máy của bạn chỉ với thông tin đăng nhập cục bộ, đổi lại mọi dữ liệu phải tải xuống một lần và tải lên một lần.

Adrien Roche, Biên tập viên hạ tầng & hosting

Kỹ sư hệ thống với hơn 10 năm vận hành các hệ thống Windows Server và Linux. Adrien phụ trách tài liệu hạ tầng của rdp.monster và viết các hướng dẫn về RDP, hosting VPS, quản trị máy chủ, mạng và công cụ bảo vệ quyền riêng tư.

Đăng ký chương trình đại lý của chúng tôi

Thông tin của bạn

Nếu bạn có bất kỳ câu hỏi nào, liên hệ với chúng tôi tại đây !
Họ và tên(Bắt buộc)
Nhập địa chỉ email của bạn, bạn cần có tài khoản trên dashboard.rdp.monster !

Công ty của bạn

Nhập địa chỉ website của bạn nếu có
Giải thích ngắn gọn cách bạn sẽ bán dịch vụ cho khách hàng. Ví dụ: trò chuyện với mọi người trên các diễn đàn.

Đến quái vật cũng mê cookie!

Chúng tôi sử dụng cookie để cải thiện trải nghiệm duyệt web của bạn, hiển thị quảng cáo hoặc nội dung phù hợp và phân tích lưu lượng truy cập. Khi nhấn "Chấp nhận", bạn đồng ý với việc chúng tôi sử dụng cookie.