Tôi phải sftp đến một máy chủ trung gian?


11

Tôi không thể trực tiếp vào một máy chủ cụ thể. Để di chuyển một tệp từ máy chủ của tôi sang máy chủ lưu trữ, tôi phải sftp một tệp đến một máy chủ trung gian; ssh vào máy chủ trung gian; và sftp các tập tin đến đích cuối cùng. Có thể tránh được sự điên rồ như vậy?

Câu trả lời:


28

Từ máy cục bộ của bạn, bạn có thể tạo đường hầm SSH thông qua máy chủ trung gian đến máy chủ cuối cùng:

ssh user@intermediate -L 2000:final:22 -N

Điều này sẽ mở cổng 2000 trên localhost của bạn, nó sẽ kết nối trực tiếp đến máy chủ cuối cùng trên cổng 22, bằng cách tạo đường hầm qua máy chủ trung gian. Bây giờ trong một dấu nhắc khác kết nối với sftp trên cổng 2000 để được chuyển qua máy chủ cuối cùng, lưu ý rằng người dùng được chỉ định ở đây là dành cho máy chủ cuối cùng:

sftp -P 2000 user@localhost

Có vẻ như điều này thuộc về superuser.com hoặc serverfault.com .


Cảm ơn, tôi sẽ thử nó; và bạn đúng đó là diễn đàn sai; lấy làm tiếc.

Sau khi cung cấp cho người dùng mật khẩu @ localhost, tôi nhận được tin nhắn: Đã nhận được tin nhắn quá dài 1131376238
user74094

14

Bạn có thể sử dụng tùy chọn ProxyCommand của SFTP để đường hầm một cách rõ ràng kết nối SFTP qua kết nối SSH (hơi giống với câu trả lời của WhiteFang34, nhưng qua stdin & stdout của kết nối SSH, thay vì cổng TCP cục bộ được chuyển tiếp):

sftp -o "ProxyCommand=ssh -e none user@intermediatehost exec /usr/bin/nc %h %p 2>/dev/null" user@finalhost

(Giả sử máy chủ trung gian đã cài đặt netcat là / usr / bin / nc - nếu không, bạn có thể phải tìm / cài đặt một số cách tương tự để chuyển stdin & stdout vào phiên TCP.)

Điều thực sự thú vị về tùy chọn này là bạn có thể thêm nó vào tệp ~ / .ssh / config, điều này làm cho nó trong suốt:

Host finalhost
    ProxyCommand ssh -e none user@intermediatehost exec nc %h %p 2>/dev/null

Với mục nhập đó, bạn có thể sử dụng sftp, scp và ssh để Finalhost và nó sẽ tự động gọi đường hầm. Phần không trong suốt duy nhất là nó sẽ nhắc hai mật khẩu (trung gian được theo sau bởi Finalhost), nhưng nếu bạn muốn, bạn cũng có thể loại bỏ điều đó bằng khóa bàn phím SSH ...


Cảm ơn Gordon. Phải mất cả hai mật khẩu sau đó tạm dừng với tin nhắn: Tin nhắn đã nhận quá lâu 1131376238
user74094

Nghe có vẻ như có gì đó trong kết nối - có thể là tập lệnh đăng nhập tại một trong các máy chủ, có thể là nc - đang viết một số văn bản bổ sung qua kết nối gây nhầm lẫn sftp (xem Câu hỏi thường gặp này tại snailbook.com ). 1131376238 là mã hóa thập phân của các ký tự ascii "Conn", do đó, đây có thể là một thông báo như "Kết nối với ..." "Đã kết nối từ ..." hoặc có thể "Kết nối thất bại". Hãy thử nó với ssh thay vì sftp, xem thông điệp được in rõ ràng và có thể bạn có thể biết nó đến từ đâu.
Gordon Davisson

ssh làm việc tốt Tôi cũng nên đề cập rằng tôi thường phải đối mặt với câu hỏi này: Tính xác thực của máy chủ lưu trữ 'xxxxx (<không có ký tự cho lệnh proxy>)' không thể được thiết lập. Dấu vân tay của khóa RSA là 37: 40: d4: c7: vv .. Bạn có chắc chắn muốn tiếp tục kết nối (có / không) không? có
user74094

Gordon, rất hữu ích! Tôi đang thêm nó vào tập tin văn bản của tôi về dòng lệnh fu oneliners. Cảm ơn rất nhiều!
Travis Leleu

execcần thiết? (Nó hoạt động tốt ở đây mà không có phần đó.)
Equaeghe

3

Bạn có thể chuyển dữ liệu tới quy trình ssh đang chạy trên máy của mình, sau đó chạy lệnh trên máy trung gian đọc stdin và gửi nó đến sftp khi thích hợp.

Điều này có thể được thực hiện trong một oneliner trên máy cục bộ của bạn, mặc dù việc trích dẫn các đối số cho ssh sẽ cần được chăm sóc. Tôi đang ở trên điện thoại của tôi ngay bây giờ vì vậy rất tiếc không thể nhập các chi tiết. Có lẽ ai đó khác có thể hoàn thành câu trả lời này như một bài tập!


0

Tôi giả sử máy chủ cuối cùng được tường lửa và tôi chỉ có thể đoán các phương thức bạn có thể sử dụng để đi xung quanh nó.

Ví dụ: hiển thị ssh từ máy cục bộ của bạn, sau đó ssh đến máy chủ đầu tiên, sau đó ssh đến máy chủ thứ hai và sftp từ máy chủ cuối cùng vào máy của bạn.


0

giả sử A và B là máy chủ thứ nhất và thứ hai. Và tập tin được sao chép là foo

Thay vì sftp, bạn có thể sử dụng như sau

mèo foo | ssh Một "con mèo -> foo"

Bây giờ, bạn có thể kết hợp chuỗi 2 trong số này với nhau

mèo foo | ssh Một "con mèo - | ssh B \" con mèo -> foo \ ""


Tôi thích nó, vì vậy tôi đã thử nó. Nó lấy mật khẩu cho A, sau đó tạo ra thông báo: Xác minh khóa máy chủ không thành công.
dùng74094
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.