LoginSignup
2
2

More than 5 years have passed since last update.

[java]コンソール入力を求められる、外部プロセス実行

Last updated at Posted at 2015-12-04

外部プロセスの実行のみであればProcessBuilderを利用し簡単に行えます。

String[] cmds = {"cmd.exe", "/k", "del", "C:\\sample.txt"};
ProcessBuilder b = new ProcessBuilder(cmds);
Process process = b.start();

boolean ret = process.waitFor(10, TimeUnit.MINUTES);
process.destroy();

※Windows環境でのコマンド
このプログラムを実行すればC:\sample.txtのファイルが削除されます。

外部プロセス実行後に、コンソール入力を求められるコマンドを実行する場合は
標準出力にコンソール入力値を出力してあげる必要があります。

コンソール入力値をプログラムから出力する例を以下に記述します。
以下の実行コマンドではdelコマンドに/pオプションを付けることで削除時に確認メッセージが表示されます。
確認時にプログラムより"Y"を入力し削除を実行します。

String[] cmds = {"cmd.exe", "/k", "del", "/p", "C:\\sample.txt"};

ProcessBuilder b = new ProcessBuilder(cmds);
Process process = b.start();

// 入力値の入力
String password = "Y";
PrintStream out = new PrintStream(process.getOutputStream());
out.println(password);
out.flush();
out.close();

boolean ret = process.waitFor(10, TimeUnit.MINUTES);
process.destroy();

※Windows環境でのコマンド

実際こんなプログラムは書かないですよね

で実際どういうときに役立つか
例えば証明書と秘密鍵を結合したPKCS12ファイルを作る場合などです。
PKCS12ファイルはjavaプログラムでは生成できないので外部プロセスのopensslを利用します。
プロセスを実行した後パスフレーズを求められます。

String processStr = "openssl pkcs12 -export -inkey greenwich.key -in greenwich.crt -out greenwich.p12";
Process process = r.exec(processStr);

Thread.sleep(1000); // 1秒待ってから処理しよう

PrintStream out = new PrintStream(process.getOutputStream()); 

String password = "greenwich"; // パスフレーズ
out.println(password); 
out.flush();

Thread.sleep(1000); // 1秒待ってから処理しよう
out.println(password); // 再入力パスフレーズ
out.flush();

out.close();

boolean ret = process.waitFor(10, TimeUnit.MINUTES);
process.destroy();

※linux環境でのコマンド
こんな感じでパスフレーズを入力し証明書と秘密鍵からPKCS12ファイルを生成します。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2