2009-02-20 38 views
10

Scenerio: Tôi muốn chạy các lệnh trên các máy từ xa từ một chương trình Java trên ssh (Tôi đang sử dụng OpenSSH trên máy phát triển của mình). Tôi cũng muốn tạo kết nối ssh bằng cách truyền mật khẩu thay vì thiết lập các khóa như tôi mong đợi.
Vấn đề: Khi cố gắng thực hiện 'mong đợi' như đăng nhập mật khẩu, Quy trình được tạo bằng ProcessBuilder dường như không thấy lời nhắc mật khẩu. Khi chạy các lệnh không phải ssh thông thường (ví dụ: 'ls'), tôi có thể nhận các luồng và tương tác với chúng một cách tốt. Tôi kết hợp tiêu chuẩn lỗi và tiêu chuẩn ra thành một dòng với redirectErrorStream(true); vì vậy tôi không thiếu nó trong lỗi tiêu chuẩn ... Khi tôi chạy ssh với tùy chọn '-v', tôi thấy tất cả các đăng nhập trong dòng nhưng tôi không xem lời nhắc. Đây là lần đầu tiên tôi cố gắng sử dụng ProcessBuilder cho một cái gì đó như thế này. Tôi biết sẽ dễ dàng hơn khi sử dụng Python, Perl hoặc ol tốt nhưng ông chủ của tôi muốn sử dụng những gì chúng tôi đang cố gắng lấy lại (các tệp nhật ký từ xa và các tập lệnh đang chạy) trong một chương trình Java hiện có để tôi bị mắc kẹt.Chạy các lệnh trên ssh với Java

Cảm ơn bạn đã trợ giúp!

Trả lời

11

Lời nhắc chỉ có thể được hiển thị khi ssh được kết nối với TTY, không phải trong trường hợp của Java.

Có thể là cách cung cấp mật khẩu trên dòng lệnh trong ứng dụng ssh của bạn. Đó sẽ là cách để vượt qua lời nhắc.

Cách khác, hãy xem xét kết nối trực tiếp với máy chủ lưu trữ từ mã Java gốc thay vì chạy một ứng dụng bên ngoài. Có a million libraries sẽ thực hiện việc này.

+2

+2 cho phương án thay thế, -1 cho không đi đến đó trước (gọi nó là "luân phiên". Net vẫn là +1 :) –

+0

Tôi khuyên bạn nên dùng paramiko cho java, khéo léo gọi là jaramiko - http://www.lag.net/jaramiko/. ban đầu trong Python, đã được chuyển sang Java. sẽ làm cho nó dễ dàng hơn để sử dụng phiên bản python khi ông chủ cho phép :) – popcnt

2

Hầu hết các chương trình có đầu óc bảo mật không sử dụng stdin/stdout để chụp mật khẩu, chúng nắm bắt TTY hoặc một số phương thức tương đương.

7

Thay vì sử dụng một chương trình ssh bên ngoài, tại sao không sử dụng một thư viện Java ssh:

Are hai tôi thấy với google - đó sẽ tránh được những vấn đề rằng openssh sẽ làm việc rất chăm chỉ để ngăn chặn nhập mật khẩu trên stdin - nó sẽ mở đầu cuối trực tiếp. mong đợi phải làm việc rất chăm chỉ để mô phỏng một tty để làm việc.

4

Tại sao không sử dụng trình khách Java ssh? This một là BSD được cấp phép và có nhiều khách hàng được liệt kê here.

1

Tôi đã sử dụng trình khách ssh trilead với nhiều thành công. Tôi cũng đã thử jsch (một khách hàng ssh java) và đường hầm cho khách hàng ssh bản địa dưới Linux. Trilead là tốt nhất.

+0

không được hỗ trợ –

0

Bạn có thể chạy các lệnh bằng cách sử dụng edtFTPj/PRO, cũng như thực hiện truyền tệp qua SFTP. Đó là Java.

1

Hãy xem bản phát hành gần đây SSHD, dựa trên dự án Apache MINA.

6

cắm: xem this ví dụ về thực hiện một lệnh trên ssh sử dụng sshj

1

Vang vọng đề nghị của người khác để sử dụng một thư viện Java SSH. Nhưng muốn bình luận về phản ứng của Cohen.Gửi mật khẩu của bạn qua dòng lệnh khi thiết lập kết nối không an toàn và cũng không được nhiều máy chủ sshd cho phép (dựa trên cấu hình).

Bạn có thể muốn xem xét việc thiết lập khóa cho điều này, để bạn có thể thực hiện lệnh ssh giữa các máy không có mật khẩu.

Basic bước - sử dụng openssh để tạo ra một cặp khóa (tôi đã thực hiện RSA nhưng tôi biết có một phương pháp tốt hơn bây giờ) - tạo một thư mục .ssh trong thư mục nhà của bạn trên máy NGUỒN - tạo ra một .ssh thư mục trong thư mục chính của bạn trên máy TARGET - giữ khóa riêng của bạn trong thư mục .ssh của máy nguồn của bạn - sao chép khóa công khai của bạn vào một tệp có tên authorized_keys trong thư mục .ssh của mục tiêu

Một số hướng dẫn có thể tìm thấy here

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