Javaとは異なるユーザーとしてUNIXコマンドを実行する
質問
異なる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'