2009-06-18 15 views
13

UNIXコマンドを実行できるJavaプログラムを別のUNIXユーザーとして書き込もうとしています。私はユーザーのパスワードを持っていて、実行したいコマンドを知っていますが、そのユーザーとしてコマンドを実行する必要があります。そのユーザーとして最初にログインする必要があります。Javaの異なるユーザーとしてUNIXコマンドを実行する

たとえば、ユーザー、jim、bobのホームディレクトリにあるものを見たいと思っている人、何らかの理由でjimがlsを実行するアクセス権を持っているのに対してbobはアクセスしていないとします。 現在、bobとしてログインしています。

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

問題は、私たちはジムのパスワードの入力を求められます。これはJavaプログラムから実行されるため、つまり

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

ジムのパスワードを要求され、ハングアップします。 ジムのパスワードはです。しかし、私はそれを入力することはできません。

さらに、Expectスクリプト(インストールされていない)を使用することはできず、スーパーユーザーになれません。我々は、技術的

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

を行うことができますので、私はまた、これをしようとするSSHを使用してに見えたが、私はセットアップパスワードなしのSSHへのアクセス権を持っていないので、これも動作しません。

パスワードはJavaプログラムで利用可能で、ログインして適切なコマンドを実行できるので、最後にはJava用のSSHライブラリを試してみてください。しかし、私は同じホスト上で実行されるので、それは過度のようです。

提案がありますか?

P.S:Javaバージョン1.4.2ではアップグレードできません。 AIX UNIX 5.3。

+0

サードパーティのライブラリを使用せずに回避策を見つけることができましたか? – HyperioN

答えて

6

問題が解決しました。既知のユーザ名とパスワードでサーバにSSHを実行し、コマンドを実行するためにJSch(http://www.jcraft.com/jsch/)を使用しました。あなたの提案をありがとう!

+0

ここに例を追加してください。 – vijendra

7

sudoがインストールされていることを確認して、問題のコマンドに対して/ etc/sudoersに入力されたJavaプログラムを実行して、sudo -u jim ls ~bobを使用します。

+0

これは解決策ではありません。残念ながら、とにかくsudoのインストールを含めてシステムを変更することはできません。 –

+2

その後、ホストを切り替える必要があります。 –

+0

Andrewと同意します。あなたのホストがpubkey SSHのようなものを許可しておらず、あなたが "sudo"をインストールすることさえできないなら、あなたの "su"スキームに関して思いつく可能性がありますどちらかといえば、あなたは困っている。 sudoを許可するhosterを見つけてください。これは賢明な解決策です。 – DevSolar

0

おそらく、ExpectのJava実装ですか?グーグルではExpectJが表示されますが、1.4.2での動作に関するドキュメントは見つかりませんでした。

+0

これは解決策かもしれません。先端に感謝します。 –

+0

さて、ExpectJはうまくいくはずです。依存関係をコピーしてビルドすることができます。問題は、しかし、ExpectJは1.5まで実装されていないStringBuilderを使用しています。助言がありますか? –

+0

あなたはExpectJの人たちに、古いバージョンがあるかどうかを尋ねることができます(sourceforgeにはバージョンがありません)。唯一の問題がStringBuilderの場合は、コードを自分で変更できるはずです。 –

0

sudoコマンドの入力をリダイレクトしてみましたか? Javaをしばらく使用していませんが、入力ストリームを取得してそこに書き込む方法があると思います。それを使ってパスワードを書いた後、新しい行とsudoを入力するか、またはsuがパスワードを受け入れる必要があります。

getInputStream()を使用してパスワードを書き出します。

su jim -c ls ~Bob 
-1

おそらく、これは動作します:

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

ありがとうございますが、動作しませんでした。前と同じようなことを試しましたが、ほぼ同じ結果が得られました。 –

-1

私はこのコードわからない:

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

はつまり、& &を評価するために必要な、シェルで実行されますシェルコマンド(/ bin/sh)。 suのコマンドラインswithで "ls〜bob"コマンドを渡すべきです。次のようなものがあります。

su jim -c 'ls ~bob' 
+0

上記と同じ結果です。 –

+0

次にSSH imhoが唯一実行可能なオプションです – dfa

関連する問題