2009-06-18 25 views
13

Cố gắng viết một chương trình Java có khả năng chạy lệnh UNIX với tư cách người dùng UNIX khác. Tôi có mật khẩu của người dùng, và tôi biết lệnh tôi muốn chạy, nhưng lệnh phải được chạy như người dùng đó - vì vậy tôi phải đăng nhập với tư cách người dùng đó trước tiên.Chạy các lệnh UNIX với tư cách người dùng khác nhau, từ Java

Ví dụ: giả sử chúng ta có người dùng, jim, người muốn xem những gì có trong thư mục chính của bob và (vì bất kỳ lý do gì) jim có quyền truy cập để thực thi ls trong khi bob thì không. Chúng tôi hiện đang đăng nhập với tư cách là bob. Dưới đây là những gì chúng tôi (có thể) làm:

[email protected]$ su jim && ls ~bob 

Vấn đề là chúng tôi được nhắc nhập mật khẩu của jim. Vì điều này được chạy từ một chương trình Java, tức là

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

chúng tôi được nhắc nhập mật khẩu của jim và gác máy. Chúng tôi biết mật khẩu của jim. Tuy nhiên, tôi không thể nhập nó.

Ngoài ra, chúng tôi không thể sử dụng tập lệnh Mong đợi (không cài đặt nó) và chúng tôi không thể trở thành siêu người dùng. Tôi cũng nhìn vào sử dụng SSH để thử loại này, vì chúng ta về mặt kỹ thuật có thể làm

[email protected]$ ssh [email protected] "ls ~bob" 

nhưng điều này cũng không làm việc kể từ khi tôi không có quyền để thiết lập mật mã SSH.

Nỗ lực cuối cùng của tôi là thử và sử dụng thư viện SSH cho Java, vì mật khẩu có sẵn cho chương trình Java và tôi có thể đăng nhập bằng (và thực thi lệnh thích hợp). Nhưng kể từ khi tôi sẽ được chạy trên cùng một máy chủ, nó có vẻ như quá mức cần thiết.

Mọi đề xuất?

P.S: Java phiên bản 1.4.2, không thể nâng cấp; AIX UNIX 5.3.

+0

bạn có thể tìm giải pháp thay thế mà không cần sử dụng thư viện của bên thứ ba, nếu bạn có thể chia sẻ? – HyperioN

Trả lời

6

Sự cố được giải quyết. Đã sử dụng JSch (http://www.jcraft.com/jsch/) để SSH vào máy chủ có tên người dùng và mật khẩu đã biết và thực thi lệnh. Cảm ơn tất cả các góp ý của bạn!

+0

vui lòng thêm ví dụ tại đây. – vijendra

7

Đã cài đặt sudo, yêu cầu người dùng chạy chương trình Java đã nhập trong/etc/sudoers cho các lệnh được đề cập và sử dụng sudo -u jim ls ~bob.

+0

Đây không phải là giải pháp. Thật không may, tôi không thể sửa đổi hệ thống trong anyway - bao gồm cả cài đặt sudo. –

+2

Bạn cần phải chuyển đổi máy chủ sau đó. –

+0

Đồng ý với Andrew. Nếu máy chủ lưu trữ của bạn không cho phép bạn sử dụng pubkey SSH và thậm chí bạn không thể cài đặt "sudo", thì có thể là bất kỳ thứ gì bạn có thể đưa ra về sơ đồ "su", trong khi có thể, không được phép hoặc, và bạn đang bị ràng buộc cho rắc rối. Tìm một con hoster cho phép sudo, nó là giải pháp hợp lý duy nhất. – DevSolar

0

Có thể triển khai java Mong đợi? ExpectJ xuất hiện khi googling nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về việc chạy dưới 1.4.2.

+0

Đây có thể là một giải pháp. Cảm ơn vì tiền hỗ trợ. –

+0

Vâng, ExpectJ trông giống như nó sẽ làm việc - quản lý để có được các phụ thuộc sao chép hơn và xây dựng. Vấn đề là, mặc dù, ExpectJ sử dụng StringBuilder, mà không được triển khai cho đến 1.5. Bất kỳ đề xuất? –

+0

Bạn có thể hỏi người ExpectJ nếu họ có một phiên bản cũ xung quanh (không có một trên sourceforge). Nếu vấn đề duy nhất là StringBuilder, bạn có thể tự sửa đổi mã. –

0

Bạn đã thử chuyển hướng nhập lệnh sudo và ghi vào đó. Tôi đã không sử dụng Java trong một thời gian nhưng tôi tin rằng có một cách để có được dòng đầu vào và ghi vào nó. Bạn có thể sử dụng nó để viết mật khẩu theo sau bởi một dòng mới và sudo hoặc su nên chấp nhận mật khẩu.

Sử dụng getInputStream() và viết mật khẩu của bạn cho điều đó.

su jim -c ls ~Bob 
-1

Có lẽ điều này sẽ làm việc:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob"); 

OutputStream standardInput = process.getOutputStream(); 
Writer standardInputWriter = new OutputStreamWriter(standardInput); 
standardInputWriter.write("password\n"); 
standardInputWriter.close(); 
+0

Cảm ơn, nhưng nó không hoạt động. Tôi đã thử một cái gì đó tương tự trước đây, nhưng với kết quả tương tự. –

-1

Tôi không chắc chắn mã này:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

sẽ được thực hiện trong một vỏ, cần thiết để đánh giá & &, đó là một lệnh shell (/ bin/sh). Bạn nên truyền lệnh "ls ~ bob" thông qua một dòng lệnh swith su.Một cái gì đó như:

su jim -c 'ls ~bob' 
+0

Kết quả tương tự như câu trả lời ở trên. –

+0

thì SSH imho là tùy chọn khả thi duy nhất – dfa

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