scp từ một máy chủ từ xa đến một máy chủ từ xa khác


15

Tôi có một tệp lớn trên máy chủ onevà tôi muốn sao chép nó vào máy chủ twobằng cách sử dụng scp. Tôi có các phím thiết lập đúng và tôi có thể ssh / scp cho cả hai máy chủ từ máy tính để bàn của mình.

Tệp tôi cần sao chép lớn hơn dung lượng trống trên hdd của máy trạm, vì vậy tôi muốn làm:

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

nhưng tôi đã nhận:

ssh: Could not resolve hostname one: Name or service not known

Chúng tôi không có DNS ở đây (đừng hỏi tôi tại sao), vì vậy tôi có cái này trong ~ / .ssh / config:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

Nếu tôi thử với một tệp nhỏ hơn và chuyển nó từ onemáy trạm của mình và sau đó two, nó hoạt động tốt:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

Khi sử dụng địa chỉ IP trực tiếp như được đề xuất trong nhận xét, tôi đã nhận được:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

Không phải là một vấn đề:

Kích thước không phải là vấn đề ở đây - nó chỉ là "tác nhân" cho vấn đề này vì không có cách nào để lưu trữ bigfile.tar.gztrên máy trạm của tôi. Vấn đề xảy ra bất kể kích thước tập tin.

Câu hỏi:

Tại sao lệnh:

scp oneremote:file secondremote:file

ném lỗi bất kể sử dụng .ssh/configbí danh hoặc trực tiếp sử dụng địa chỉ IP?

Đã giải quyết - loại - vẫn đang tìm kiếm lời giải thích - Tôi đã chia bigfile thành các tệp nhỏ hơn và chuyển từng cái một qua máy trạm của tôi. Tôi vẫn đang tự hỏi tại sao nó không hoạt động. Vì vậy, tôi vẫn sẽ đánh giá cao một số lời giải thích về những gì sai ..

Tìm thấy một lý do tại sao nó thất bại: Có vẻ như tôi đã ngu ngốc. Tôi nghĩ rằng lệnh

scp one:file two:file

đã tạo hai kết nối đến mỗi máy chủ và sau đó nhận dữ liệu từ một và ngay lập tức gửi chúng đến hai và do đó hoạt động như một rơle.

Đây rõ ràng không phải là trường hợp, bởi vì một -vtùy chọn đơn giản tiết lộ rằng trên thực tế nó chỉ kết nối với một và từ một nó cố gắng kết nối với hai . Mà rõ ràng là không thể vì máy chủ một là không được phép kết nối với hai .


Bạn đã thử chỉ thay đổi lệnh scp của mình để sử dụng các địa chỉ IP thay vào đó như "scp jspurny @ ip_address_server_one: /opt/bigfile.tar.gz jspurny @ ip_address_server_two: /opt/bigfile.tar.gz".

@tchester: Tôi đã làm ngay bây giờ, nhưng nó chỉ đưa ra một lỗi khác (xem câu hỏi đã được chỉnh sửa)
Jan Spurny


@slm không, tôi không có vấn đề gì với kích thước.
Jan Spurny

Khi tôi tìm thấy lời giải thích về các lỗi, tôi muốn thêm / chấp nhận nó như là câu trả lời của riêng tôi, nhưng có vẻ như tôi hơi bất công vì nó thực sự không giải quyết được vấn đề. Bạn có nghĩ rằng tôi nên viết lại câu hỏi thành: Làm thế nào để sao chép tệp từ máy chủ một đến máy chủ hai bằng cách sử dụng máy trạm của tôi làm rơle không? hoặc tôi nên thêm lời giải thích về việc tôi không thể sử dụng tùy chọn --verbose làm câu trả lời và chấp nhận nó?
Jan Spurny

Câu trả lời:


6

Ống đơn giản

Thử đi:

ssh one 'cat file' | ssh two 'cat > file'

Người đầu tiên sẽ gửi nội dung tệp đến máy của bạn, trong khi người thứ hai sẽ gửi nội dung đó đến máy thứ hai. Tôi sẽ tính toán tổng kiểm tra ở cả hai đầu sau khi chuyển tiền, để đảm bảo rằng không có gì bị mất hoặc bị cắt xén trên đường đi.

Xây dựng đường hầm

Đối với các ứng dụng phức tạp hơn, bạn có thể sử dụng đường hầm ssh. Ví dụ: bạn có thể thử một cái gì đó như thế này:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

Sau đó, bạn có thể mở một kết nối trên onemáy localhostcổng 5001và nó sẽ được chuyển tiếp hai lần và kết thúc như là một kết nối trên twođể localhostcổng 22. Đây là cổng ssh, vì vậy bạn có thể sử dụng cổng này cho một scp khác, hoặc cho rsync, hoặc bất cứ điều gì. Bạn cũng có thể khởi động rsyncmáy chủ twovà chuyển tiếp cổng 873 thay vì 22. Hoặc bạn có thể sử dụng ncở cả hai bên để truyền dữ liệu thô, sử dụng số cổng tùy ý.

Lợi ích chính giữa cách tiếp cận trên là bạn có kết nối tcp hai chiều giữa hai máy, thay vì chỉ một ống một chiều. Bằng cách đó, hai bên có thể trao đổi thông tin, điều đặc biệt quan trọng trong rsyncvụ án.


1
Cảm ơn! Điều này không làm chính xác những gì tôi muốn , nhưng những gì tôi thực sự cần , thật tuyệt.
Jan Spurny

16

Tín dụng đầy đủ cho câu trả lời này được gửi tới /superuser//a/602436/142948

Bạn cần -3tùy chọn cho scp:

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3: Bản sao giữa hai máy chủ từ xa được chuyển qua máy chủ cục bộ. Không có tùy chọn này, dữ liệu được sao chép trực tiếp giữa hai máy chủ từ xa.

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

Mặt khác, bí danh thứ hai "hai" đang được giải quyết trên máy chủ "một" , có thể không tồn tại.


Thật không may, tùy chọn này dường như còn khá mới và được truyền bá tới tất cả các bản phát hành.
theo đó,

2

Vì bạn có quyền truy cập của người dùng vào máy chủ nguồn (một) tại sao không đăng nhập và chạy lệnh scp của bạn trên máy chủ đó ... Nếu bạn lo lắng rằng nó sẽ mất quá nhiều thời gian, thì hãy khởi động lệnh bên trong screenrồi tách ra khỏi màn hình bằng Ctrl+a dvà hãy để nó chạy

Tuy nhiên, nếu bạn phải thực hiện việc này từ máy trạm của mình và các khóa SSH từ nguồn đến máy chủ đích đang hoạt động tốt, thì hãy gửi scplệnh dưới dạng tham số của sshlệnh, như:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'

Cảm ơn, điều đó chắc chắn sẽ hoạt động, ngoại trừ cả hai máy chủ đó đã vô hiệu hóa Mật khẩu và tôi không thể thêm khóa từ cái này sang cái khác - chúng không thể kết nối với nhau.
Jan Spurny

0

Tìm kiếm thông báo lỗi: "Xác minh khóa máy chủ không thành công." dường như là điều đơn giản nhất để làm ở đây. Tôi đã tìm thấy câu hỏi và trả lời này trên Askubfox có tiêu đề: Sự cố kết nối SSH với xác minh khóa Máy chủ lưu trữ không thành công .

Một trong những câu trả lời cho câu hỏi và trả lời đó cho rằng vấn đề đã nói dối với một mục mâu thuẫn trong ~/.ssh/known_hoststệp của bạn . Bạn có thể xóa các mục rắc rối khỏi tệp đó bằng bất kỳ trình soạn thảo văn bản nào hoặc bạn có thể sử dụng lệnh này để xóa các mục:

$ ssh-keygen -R hostname

Trong trường hợp hostnamesẽ là một trong hai địa chỉ IP hoặc tên của máy chủ bạn đang cố gắng để kết nối từ. Tất cả các bên trên sẽ được lưu trữ trên hai bằng cách này.


Tôi không chắc là tôi có hiểu không. Tôi có thể ssh đến onetwomáy chủ từ máy trạm của mình mà không gặp vấn đề gì .. vấn đề bắt đầu khi tôi chạy scp one:file two:filetừ máy trạm. Và không có known_hoststập tin nào trên một hoặc hai . Tôi chỉ cố gắng loại bỏ các khóa cho hai (thậm chí cho một để chắc chắn) trên máy trạm của tôi nhưng không có gì thay đổi (ngoại trừ bạn có chắc chắn y / n propt).
Jan Spurny

@JanSpurny - việc bạn đề cập đến máy trạm của bạn đã hơi khó hiểu trong Q này, ít nhất là với tôi. Khi bạn nói rằng bạn có nghĩa là máy tính xách tay / máy tính để bàn của bạn. Vì vậy, bạn đang làm một cái gì đó như thế này khi bạn nói rằng nó "hoạt động": scp workstation:file one:fileworkstation:file two:file? Rõ ràng là bạn không cần phải nói "máy trạm: tập tin" Tôi chỉ nói rõ ràng vì lợi ích của cuộc trò chuyện.
slm

Vâng, điều tôi nghĩ là tôi đã chạy tất cả các lệnh từ máy trạm của mình. Vì vậy, nó giống như: workstation$ scp one:file fileworkstation$ scp file two:file. Dù sao, tôi nghĩ rằng tôi đã giải quyết nó. Tôi sẽ thêm nó dưới dạng câu trả lời của riêng tôi.
Jan Spurny

@JanSpurny - OK, rất vui vì bạn đã tìm ra nó. Cảm ơn câu hỏi BTW!
slm
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.