2011-07-21 55 views
5

Tôi cần để có thể ssh từ một chương trình Java vào một máy chủ từ xa, và từ đó SSH đến một máy chủ khác. Tôi có thông tin đăng nhập cho cả hai máy chủ trên máy khách của mình.Làm thế nào để SSH đến một máy chủ đằng sau một máy chủ SSH bằng cách sử dụng JSch?

Lệnh sẽ được chuyển tự động từ bên trong ứng dụng dưới dạng chuỗi thông thường (không có đầu vào của người dùng). Tôi cần để có thể chạy các lệnh tùy chỉnh trên máy chủ thứ hai và có thể quyết định lệnh nào sẽ phát hành trong thời gian chạy, dựa trên đầu ra và một số logic đơn giản.

Tôi có thể sử dụng JSch để làm điều đó và nếu có, tôi nên bắt đầu xem xét ở đâu? (Ví dụ, thông tin)

========================================= ====================

thêm:

Exception in thread "main" com.jcraft.jsch.JSchException: UnknownHostKey: host .mạng lưới. Dấu vân tay khóa RSA là 'blahblahblah'

cho đến bây giờ, tôi đang giải quyết vấn đề này bằng cách sửa đổi tệp known_hosts và thêm máy chủ theo cách thủ công vào đó. Tôi có thể bỏ qua vấn đề nhỏ này không bằng cách cài đặt một tùy chọn ở đâu đó để cho JSch tự động nhấn YES khi câu hỏi YES-NO này được hỏi?

Trả lời

10

Để kết nối với máy chủ thứ hai phía sau tường lửa, có hai nguyên tắc tùy chọn.

Người ngây thơ sẽ gọi số ssh trên máy chủ đầu tiên (từ kênh exec), cho biết máy chủ phù hợp. Điều này sẽ cần chuyển tiếp tác nhân với JSch, và cũng không cung cấp API JSch để truy cập vào máy chủ thứ hai, chỉ dòng lệnh ssh.

Cách tốt nhất là sử dụng kết nối với máy chủ đầu tiên để xây dựng đường hầm TCP và sử dụng đường hầm này để kết nối với máy chủ thứ hai. JSch Wiki chứa ProxySSH class (cùng với một số mã ví dụ) cho phép sử dụng phiên JSch làm đường hầm cho phiên JSch thứ hai. (Tuyên bố miễn trừ trách nhiệm: Lớp này được viết chủ yếu bởi tôi, với sự hỗ trợ của tác giả JSch.)

Khi bạn có kết nối với máy chủ thứ hai, hãy sử dụng kênh shell hoặc một loạt các kênh để thực hiện lệnh của bạn. (Xem Shell, Exec or Subsystem Channel trong JSch Wiki cho một cái nhìn tổng quan và Javadocs để biết chi tiết.)


Đối chưa biết-host-key vấn đề của bạn:

Phiên bản an toàn sẽ thu thập tất cả các khóa máy chủ (một cách an toàn) trước và đặt chúng trong tệp known_hosts. (Nếu bạn chỉ đơn giản là tin tưởng chìa khóa được trình bày cho bạn, bạn sẽ dễ bị tấn công bởi người đàn ông trung gian. Nếu đây không phải là mối quan tâm trong mạng của bạn, vì nó được bảo mật về mặt thể chất, tốt cho bạn.)

Các thuận tiện phiên bản được thiết lập configuration optionStrictHostKeyChecking để no - điều này sẽ thêm host key không biết đến host key file:

JSch.setConfig("StrictHostKeyChecking", "no"); 

(Bạn cũng có thể thiết lập nó riêng rẽ trên các phiên họp, nếu bạn chỉ muốn đặt nó cho phiên được ủy quyền chứ không phải cho phiên đường hầm. Hoặc ghi đè lên phiên đường hầm với yes hoặc ask - có nguy cơ MITM có thể lớn hơn.)

A cách giữa sẽ cho phép thực sự yêu cầu người dùng (sau đó nên so sánh dấu vân tay với một số danh sách) - cho điều này, triển khai giao diện UserInfo và cung cấp đối tượng cho phiên. (Các JSch Wiki có chứa một example implementation using Swing JOptionPanes, mà bạn chỉ có thể sử dụng nếu chương trình khách hàng của bạn chạy trên một hệ thống với GUI.)

Để lưu các khóa máy chủ được chấp nhận hoạt động, bạn phải sử dụng phương thức JSch.setKnownHosts , không phải là đối tượng có tham số InputStream - nếu không việc chấp nhận của bạn sẽ phải được lặp lại cho mỗi lần khởi động lại máy khách của bạn.

+0

hoạt động tuyệt vời !. thế nào tôi có thể sử dụng cùng một cổng để truy cập hai hoặc nhiều máy chủ SSH khác nhau đằng sau cổng đó? –

+0

nvm, có bạn có thể. –

+0

@Martin: Có, tôi đã sử dụng nó theo cách này (để truy cập khoảng 23 máy chủ ẩn đằng sau một cổng đơn). –

Các vấn đề liên quan