質問

異なるUNIXユーザーとしてUNIXコマンドを実行できるJavaプログラムを作成しようとしています。ユーザーのパスワードがあり、実行するコマンドはわかっていますが、コマンドはそのユーザーとして実行する必要があるため、最初にそのユーザーとしてログインする必要があります。

たとえば、bobのホームディレクトリにあるものを確認したいユーザーjimがいて、jimには(何らかの理由で)lsを実行するアクセス権がありますが、bobにはありません。 現在、bobとしてログインしています。これが、私たちが(できる)ことです:

bob@host$ su jim && ls ~bob

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

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

jimのパスワードの入力を求められ、電話を切りました。 jimのパスワードを知っています。ただし、入力できません。

さらに、Expectスクリプトを使用することはできません(インストールしないでください)。また、スーパーユーザーになることもできません。技術的にできるので、これを試すためにSSHを使用することも検討しました

bob@host$ ssh jim@host "ls ~bob"

しかし、パスワードなしのSSHを設定する権限がないため、これも機能しません。

最後の努力は、Java用のSSHライブラリを試して使用することです。Javaプログラムでパスワードを使用でき、それでログイン(および適切なコマンドを実行)できるからです。しかし、私は同じホストで実行するので、やり過ぎのようです。

提案はありますか?

PS:Javaバージョン1.4.2、アップグレードできません。 AIX UNIX 5.3。

役に立ちましたか?

解決 2

問題は解決しました。 JSch( http://www.jcraft.com/jsch/ )を使用して、既知のユーザー名とパスワード、およびコマンドの実行。ご提案ありがとうございます!

他のヒント

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

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

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

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

su jim -c ls ~Bob

おそらくこれは機能するでしょう:

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

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

このコードはわかりません:

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

は、&&の評価に必要なシェルで実行されます。これはシェルコマンド(/ bin / sh)です。コマンド" ls〜bob"を渡す必要があります。 suのコマンドラインスイッチを使用します。次のようなもの:

su jim -c 'ls ~bob'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top