Làm cách nào tôi có thể sao chép nhiều tệp qua scp trong một lệnh?


19

Tôi phải vận chuyển rất nhiều tệp từ PC này sang PC khác (cả Linux). Tôi muốn sử dụng scp cho điều đó, nhưng scp chỉ cho phép chuyển một tập tin tại một thời điểm.

Tôi có thể làm cái này như thế nào?

Tôi có

  • Không có khả năng sử dụng rsync hoặc bất kỳ giao thức nào khác
  • Không có khả năng sử dụng chứng chỉ không có cụm mật khẩu (nhưng có chứng chỉ có cụm mật khẩu)
  • Danh sách các tệp cần truyền và một danh sách có đường dẫn đích của các tệp trên máy chủ khác
  • Các tệp được trải ra trên rất nhiều thư mục và không phải tất cả các tệp trong thư mục tôi muốn sao chép

Nếu có thể, tôi muốn gzip và ungzip trong suốt để tiết kiệm băng thông!

Điều này có thể không?

Câu trả lời:


29

Sử dụng tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
Đây là định dạng tệp: "Trong chế độ c, tar sẽ đọc tên được lưu trữ từ tên tệp. Tên đặc biệt -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C ''. "
Kousha

13

Tôi muốn sử dụng scp cho điều đó, nhưng scp chỉ cho phép chuyển một tệp tại một thời điểm.

Tôi khá chắc chắn rằng điều đó không đúng, ít nhất là không phải vì scp lệnh được cung cấp bởi OpenSSH có trong hầu hết các bản phân phối Linux.

tôi sử dụng scp file1 file2 ... fileN user@host:/destination/directory/ khá thường xuyên

Để nén trong suốt, giao thức SSH được tích hợp sẵn và scp có thể sử dụng nó nếu bạn cung cấp -C tùy chọn trên dòng lệnh. Đối với nhiều tệp nhỏ tương tự, bạn sẽ tìm thấy tùy chọn tar + gz được đề xuất bởi akira giúp nén tốt hơn vì nó có thể sử dụng sự tương tự giữa các tệp như vậy trong đó scp nén mỗi tệp dưới dạng một thực thể riêng biệt. Tôi thường thích sử dụng scp hơn vì việc chuyển lại một phần dễ dàng hơn (hoặc, mặc dù tôi biết trong tình huống này, người hỏi không có tùy chọn này) rsync vì điều đó thậm chí còn dễ dàng hơn để tiếp tục và chia sẻ lợi thế nén toàn luồng của tùy chọn tar + gz.


Đây là câu trả lời đúng, nhưng nó thực sự chỉ chuyển một tệp tại một thời điểm. Tuy nhiên, nó sẽ sử dụng đầy đủ băng thông có sẵn và nên chạy nhanh nhất có thể.
Benjamin Bannier

4

Không scp -r yourdir otherhost:/otherdir công việc?

Hãy thử điều này sau đó:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

các z -flag để tar không nén. Hoặc bạn có thể sử dụng -C để ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

làm gì -C làm gì
Nathan Fellman

Vấn đề là, tôi có một danh sách các tập tin. Các tệp được trải ra trên rất nhiều thư mục và không phải tất cả các tệp trong thư mục tôi muốn sao chép
Peter Smit

2
@Nathan: -C là để cho ssh thực hiện việc nén.
Jimmy Hedman

1

Trên RHEL5, đây là cách duy nhất có thể mà tôi biết để sao chép an toàn danh sách các tệp chứa các ký tự đặc biệt (như khoảng trắng). Tạo một kịch bản shell và bao gồm các phần sau:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

Nó có thể được thực hiện với nhiều rắc rối.

Tôi chỉ cần tạo một danh sách các tệp có tên máy chủ bên cạnh mỗi tệp và scp dường như phân tích nó tốt. I E.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp dường như hoạt động tốt với cú pháp này. Khi tôi thử nó mà không có tên máy chủ bên cạnh mỗi tệp, nó đã thất bại sau tệp đầu tiên. Tôi dường như nhớ lại một cú pháp khác mà tôi đã sử dụng cho điều này trước đây và sẽ đăng nó khi tôi định vị nó.


Điều này hoạt động, nhưng khá chậm - dường như bắt đầu kết nối cho mỗi tệp ... (Tôi đến đây để tìm giải pháp cho bản sao chậm ...) ~/ hầu hết có thể bị bỏ qua - SCP hoạt động liên quan đến thư mục chính ... Nếu bạn có một danh sách từ nơi khác trong $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination (Điều này sẽ phá vỡ tên tập tin với không gian mặc dù)
Gert van den Berg

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.