Có cách nào để tiếp tục một scp bị gián đoạn của một tập tin?


11

Thỉnh thoảng tôi tải xuống một tệp rất lớn thông qua scp và có một cơ hội nhỏ mỗi lần kết nối bị rớt và cắt giữa chừng.

Có cách nào để tiếp tục nó?

Câu trả lời:


9

Bạn có thể thử cách chấp nhận sau: thay vì scp sử dụng dd để bỏ qua phần đã tải xuống và nối phần còn lại vào tệp.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Tối ưu hóa có thể: làm việc với các khối lớn. Hãy để nó như một bài tập về nhà.


Tôi chưa thử nghiệm điều này, nhưng tôi chấp nhận câu trả lời một cách ngập ngừng vì sử dụng dd nghe có vẻ là một cách tiếp cận tuyệt vời cho giải pháp.
GJ.

Tôi chỉ thử nghiệm nó, hoạt động hoàn hảo, cảm ơn bạn!
Kossak

@Kossak, rất vui được nghe!
18 giờ 42 phút

ddvới khối nhỏ có thể chậm (chỉ 350 kB / s ở đây). May mắn thay, scpchuyển dường như đến trong khối 1024 byte. Nếu vậy đối với tệp của bạn (hoặc cách khác, bằng cách cắt nó thành khối 1024 byte gần nhất), bạn có thể tăng tốc nó như thế này : ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Lưu ý rằng $sofarsau đó phải là số lượng khối 1024 byte để bỏ qua!)
tanius

2
Phải mất một thời gian tôi mới nhận ra rằng rsystrong dòng thứ hai chỉ là một tên máy chủ ví dụ không phải là một đối số đặc biệt ssh. Tôi đề nghị bạn thay thế nó user@hostđể tránh nhầm lẫn.
Ahmed Essam

7

Với scp, không.

Nếu cả hai đầu đều có nó, bạn có thể sử dụng rsync -LvzP remoteserver:path/to/file localfileđể chuyển một tệp duy nhất.


Điều này giúp tôi tiết kiệm hàng giờ để tải xuống một tệp lớn bị gián đoạn. Cảm ơn bạn.
phette23

3

Vâng, có nhiều cách để tiếp tục từ điểm bị gián đoạn, nhưng không thể sử dụng scp. sftp reget filenamelàm những gì bạn cần. Yarek và Grawity đã cung cấp các giải pháp hợp lệ mà tôi +1 cho cả hai, nhưng để tiếp tục từ một điểm bị gián đoạn, tôi thích rsync. Các lệnh ví dụ được cung cấp cả hai giả sử bạn đang truy xuất một tệp từ máy chủ từ xa đến máy trạm cục bộ (đang tải xuống). Xin lưu ý rằng hai tham số cuối cùng phải được coi là source_file và target_file theo thứ tự đó. Cú pháp của tên tệp thay đổi dựa trên việc tệp nguồn hoặc tệp đích là cục bộ hay từ xa. Nếu tôi đang gửi (tải lên) tệp [văn bản], tôi sẽ viết lại các ví dụ được cung cấp dưới dạng:

# Từ địa phương đến từ xa
sofar = `ssh remote_system ls -l interted_file | awk '{in $ 5}' `;
dd if = source_file bs = 1 Skip = $ sofar | ssh remote_system "mèo >> ./interrupted_file"

Và với giải pháp rsync, tôi thêm vào -e ssh. Bạn nên xem xét liệu bạn có cần độ dài, nén, giữ quyền sở hữu, quyền, dấu thời gian, thư mục recurse, v.v. Kiểm tra trang man và google, liên quan đến tham số -L. Bạn có thể muốn các liên kết tượng trưng vẫn là liên kết thay vì tham chiếu chúng.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file


1

Có một giải pháp (ngoài rsynchoặc ddcác giải pháp nêu ra ở đây) mà tôi ngạc nhiên không ai nhắc đến: đó là reputlệnh của sftp.


0
scp -o ConnectTimeout 60

Cho phép bạn chỉ định thời gian chờ cho một kết nối. Có thể giữ kết nối của bạn khỏi chia tay.


0

Có, nếu cả hai kết thúc hỗ trợ sftp - sau khi scp remoteuser@remotehost:/absolute/filename .thất bại, bạn có thể tiếp tục bằng cách thực hiện sftp remoteuser@remotehostvà sau đó reget /absolute/filenametiếp tục tải xuống.

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.