Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

JavaプログラムからLinuxコマンド入力画面への出力方法

Javaのプログラムを使ってLinuxのiptablesを制御するといった事をしたいのですが、
Javaのプログラムの出力をLinuxのコマンド入力画面もしくはiptablesに出力する事は可能なのでしょうか?
また可能な場合どういった方法を使えばいいのでしょうか。
よろしくお願いします。 

8

回答

81070

閲覧

8件の回答

評価

0

標準出力へはSystem.out.println()やSystem.out.print()系列を普通は使いますね。

>iptablesに出力する事は可能なのでしょうか?
これは通常のコマンド同様パイプで処理できると思います。

評価

0

もしかしたらRuntimeのexecあたりかな?

runtime.exec("iptables -F");

の様な使い方ができるはず。
ちょっと使うの大変だけど。

評価

0

>tamaさん、適当さんありがとうございます。そのやり方でやってみます。

あと質問なのですが、その方法で「service iptables restart」などの命令を実行できたりするのでしょうか?

評価

0

実際やってみれば良いです。

評価

0

それから、「>」の記号は引用を意味します。
そのようには使いません。

評価

0

一応書いておくと、実験は「ls」とかの、出力系から始めましょう。
いきなり目的のコマンドを実行しようとして間違えてて、変なことになっても困りますからね。

評価

0

適当さんが書いているようにRuntime#exec()を使うことになると思いますが。
以前これではまった事がありますので、それを書いてみます。

1.exec後、コマンドの戻り値を取得するためにwaitFor()でコマンドが終了するのを待っていたが終わらない。

原因:コマンドが標準出力や標準エラー出力を行う物は出力が完了しないので終わらない。
対策:getInputStream()とgetErrorStream()で出力内容を取得してあげる。

2.getInputStream()とgetErrorStream()両方使う場合、どちらかの出力が無いとreadでロックする。
原因:インプットストリームのready()でチッェクせず、無条件にreadしていたので出力の無い方でロックしていた。

3.インプットストリームで出力があるにもかかわらず、取得できない。
原因:コマンドが出力する前にready()でチェックしていたため、そのまま抜けてしまった。

4.waitFor()していないにもかかわらず、コマンドが終了しない。
原因:この場合普通インプットストリームは不要なのではずしていたが、コマンドが出力している文字が多すぎてバッファフルになってしまった。

あと、コマンドの出力結果が要らない場合、取得したストリームを単純にクローズすればOK。

今考えると、恥ずかしい事してますね・・
でもこうやって皆大きくなるんです^^;

評価

0

>以前これではまった事がありますので、それを書いてみます。

Runtime#exec()は、嵌りやすいですね。
私も以前、嵌ったことがあります。

しかも、バッファに関連するバグが、適度に仕込まれていたこともあって、結構たちが悪かったですし。

嵌りすぎて、JNIに逃げたこともあります。

JAVA5でProcessBuilderとか、導入されましたけど、Runtime#execと変わりませんし。

もっと簡便に使用できるようにならないものですかね。。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。