Làm cách nào để _MISE_ tập tin với scp?


46

Làm cách nào để không sao chép nhưng di chuyển tệp từ máy chủ này sang máy chủ khác (cả Linux)?

man scpđã không cho tôi bất cứ điều gì hữu ích. Tôi không thể sử dụng 'scp' rồi 'rm' vì tôi phải đảm bảo tệp được chuyển thành công. Nếu có bất kỳ lỗi nào trong quá trình chuyển, tập tin không được xóa.

Có lẽ tôi nên sử dụng mã thoát bằng cách nào đó, nhưng làm thế nào? Ngoài ra, có rất nhiều tệp và nếu tệp cuối bị lỗi thì đó là tùy chọn không tốt để giữ toàn bộ tệp được chuyển thành công.

Có lẽ có một cái gì đó ngoài SCP?

Câu trả lời:


47

rsync trên ssh có lẽ là đặt cược tốt nhất của bạn với --remove-source-filestùy chọn

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

một bài kiểm tra nhanh cho;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

Như @SvenW đã đề cập, -e sshlà mặc định nên có thể bỏ qua.


7
-e sshlà mặc định ngầm trong nhiều năm nay, thường không cần sử dụng tham số này nữa.
Sven

@SvenW ah tốt để biết! Tôi không có nhiều nhu cầu về rsync hàng ngày vì scp hỗ trợ chế độ đệ quy cho hầu hết các mục đích.
Tom H

Sau đó, hãy sử dụng tính năng này để dọn sạch mọi thư mục trống (rsync sẽ không xóa chúng): serverfault.com/a/95935/58568
bmaupin

1
Chỉ cần thêm vào smv() { rsync -az --remove-source-files "$@"; }hộp công cụ của tôi. Cảm ơn bạn.
Rhys Ulerich

Nếu bạn không có rsync thì sao? Ví dụ: OpenWrt không có rsync và tôi cần sử dụng scp để di chuyển tệp. Làm gì bây giờ?
valentt

19

Sử dụng rsyncthay vì scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

Thêm thông tin với man rsync.


17

Câu hỏi này đã được trả lời tốt, và câu trả lời được chấp nhận, nhưng vì nó nổi lên trên cùng của trang nhất, tôi nghĩ rằng ít nhất tôi sẽ cố gắng trả lời chính xác hơn, nếu kém thanh lịch. Có, bạn có thể sử dụng mã trả về từ scpvà tôi làm điều đó thường xuyên. Trong bash:

scp foo user@server:/destination && rm foo

Tôi đưa ra quan điểm của bạn về nhiều tệp để sao chép và xử lý thất bại trong ngăn xếp một cách chính xác, vì vậy đối với nhiều tệp:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

Điều này cuối cùng chỉ thực tế nếu bạn đang sử dụng ssh-agent, nhưng tôi rất hy vọng bạn đang có.


1
Tôi cảm thấy điều này nên đã có câu trả lời. Nó trả lời chính xác câu hỏi.
Travis Griggs

Vì SCP không xử lý giới hạn băng thông (AFAIK), tôi đã sử dụng hanswer của bạn với rsync để di chuyển từng tệp một tại một băng thông được xác định. Cảm ơn !
Moonchild

@Moonchild, scp thực sự có thể xử lý giới hạn băng thông bằng cách sử dụng -lcờ. Ví dụ: -l 8192để giới hạn chuyển khoản ở 8192 kb / s
Spencer D

3

trong tình huống của tôi, cổng ssh không phải là 22, vì vậy

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

làm việc cho tôi


5
Bạn sẽ tốt hơn nhiều khi đưa số cổng ssh tùy chỉnh vào tệp cấu hình ssh của bạn (~ / .ssh / config) hơn là chỉ định chúng cho mỗi lệnh. Nó có thể được chỉ định trên toàn cầu, trên mỗi máy chủ hoặc cho một biểu thức chính quy khớp với tên máy chủ.
lẻn

Làm cách nào để đặt cổng riêng cho cả nguồn và đích?
Brethlosze

3

nếu bạn có máy chủ mục tiêu cũ hơn như tôi, bạn không thể sử dụng

--remove-source-files

nhưng bạn phải sử dụng

--remove-sent-files --protocol=29

thay thế.


3

Nếu thực hiện theo hai bước không phải là vấn đề, bạn có thể sử dụng scpđể sao chép tệp từ máy chủ từ xa, sau đó thực hiện ssh -e "rm /path/to/file"để xóa khỏi đĩa. Khi di chuyển tệp đặc biệt là giữa các máy, mọi thứ có thể bị sai, vì vậy có thể tốt khi thực hiện sao chép và xóa riêng biệt và chỉ xóa tệp khi bạn biết chắc chắn rằng nó đã được sao chép thành công trước.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.