• ベストアンサー

Java getRuntime().exec() でのパイプ利用に関して。

はじめまして。 JavaのgetRuntime().execでコマンドプロンプトを動かそうと思っております。 コマンドプロンプトで「netstat -an | find "***"」というコマンドをJavaから実行したいと思っています。 しかし、Javaではパイプ(=|)を利用したコマンドは実行できない。 ということを検索してたどり着きました。 例などでは、「シェル」を利用しろ。などとかかれていましたが何をどうすればいいかわかりません。 String[] s = {"netstat","-an"}; Process process = Runtime.getRuntime().exec(s); 今は上記の状態で「netstat -an」が実行されています。 どうすれば「find "***"」で***の検索をかけることができるでしょうか? どうぞ、よろしくお願いいたします。

  • Java
  • 回答数5
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • akomot
  • ベストアンサー率50% (2/4)
回答No.3

String[] s = {"cmd.exe", "/c", "dir c: | find /i "***"}; Process process = Runtime.getRuntime().exec(s); InputStream is = process.getInputStream(); こんな感じで使っていますが、だめですか?

nukiharu
質問者

お礼

お返事ありがとうございます。 String[] s = {"cmd.exe", "/c", "netstat -an | find "\"***\""}; に変更したら無事に実行し、結果を得ることができました。 ありがとうございます。 ところで、重ね重ねの質問になってしまうのですが、上で使用されている「cmd.exe」と「/c」これらの意味(前者はcmdの起動だと思いますが。)と必要な理由を教えていただけないでしょうか?

その他の回答 (4)

  • SN1701
  • ベストアンサー率76% (16/21)
回答No.5

ほとんど問題は解決しているようですが,'cmd.exe /c'が「必要な理由」についてだけ... 端的に言うと,パイプ('|')やリダイレクト('<'や'>')を解釈して,実行前に,プログラム同士をつなげたり,出力をファイルにまわしたりする準備をしているのが,cmd.exe だからです. Java から,Runtime.getRuntime().exec(...)で実行した場合,cmd.exeを経由せず,直接実行ファイルを実行しますのでパイプ等は解釈されないことになります. というわけで,明示的にcmd.exeを経由して動かしてやれば,パイプが解釈されるというわけです. ちなみに,cmd.exe のような仕事をするプログラムのことを「シェル」と呼びます.

nukiharu
質問者

お礼

お返事ありがとうございます。 なるほど。 普通に「netstat -an」のようなコマンドを入力するだけで起動やら準備までやってくれるものだと思っていました。 大変参考になりました。ありがとうございます。

  • akomot
  • ベストアンサー率50% (2/4)
回答No.4

ANo.3です。 cmd.exeはコマンドプロンプの起動です。/cはコマンドプロンプトのオプションで付けるとコマンドを実行後コマンドプロンプトが終了します。 コマンドプロンプトで「cmd /?」を打ち込むといろいろオプションが確認できますので興味があれば見てみてください。

nukiharu
質問者

お礼

たびたびありがとうございます。 なるほど、cmdに関する知識が全然足りなかったみたいですね。 次からはご迷惑をおかけしないようにきちんと調べてから質問しますね。 本当にありがとうございました。

回答No.2

たぶん無理だと思いますが、(試してもいません。) netstatのProcessオブジェクトからgetOutputStreamメソッドで出力ストリームを取得し、出力ストリームから取得した結果を findのProcessオブジェクトからgetInputStreamメソッドで取得した入力ストリームへ入れる… というのはどうでしょうか… おそらくダメだから、 >Javaではパイプ(=|)を利用したコマンドは実行できない。 >ということを検索してたどり着きました。 となっているのでしょうけど…

nukiharu
質問者

お礼

たびたびありがとうございます。 上記の方法を試すプラグラミング能力がないわけですが・・・ import java.io.*; public class Gaibu { public static void main(String[] args) { try { String[] s1 = {"netstat","-an"}; Process process = Runtime.getRuntime().exec(s1); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } } これを実行した結果(→netstat -anでport表示)をどこかに格納してその結果の中へfindコマンドを実行できる。ということでしょうか? >おそらくダメだから、 >>Javaではパイプ(=|)を利用したコマンドは実行できない。 >>ということを検索してたどり着きました。 >となっているのでしょうけど… というのは、「netstat -an | find "***"」のように二つのコマンドをパイプを利用して、一回で利用することができない。 ということなので、「netstat -an」の結果をどこかに保持し、それに対して「find "***"」(*は検索したいポート番号)のコマンドを実行することができるのならば、可能だと思います。 この際結果の保持を形として現れない一時記憶が理想なので・・・ 結果をファイルとして出力→それに対して「find」コマンドというのは避けたいかな。とか・・思ってます。 親切に返信心から感謝いたしております。

回答No.1

コマンドプロンプトなので、Windowsのことで良いのかな? Windowsなら netstat -an | find "***" とファイルに書いて、拡張子を「bat」にしてファイルに保存し、 javaからは上記batファイルを実行すれば良いと思います。 実行結果は、java.lang.ProcessクラスのgetOutputStreamメソッド、getErrorStreamメソッドで取るか、ファイルI/Oかな。

nukiharu
質問者

お礼

お返事ありがとうございます。 batファイルで実際にできるかどうかを確認してみます。 できることなら、batファイルではなくJavaのプログラム内での実行をしたいのですが、それは無理なのでしょうか?

関連するQ&A

  • Runtime クラスのexecメソッドについて

    javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。 try{ Process process = Runtime.getRuntime().exec("hogehoge"); /*---------------------------------------------------------*/ ここで、いかにしてJTextAreaに出力するのかわかりません /*---------------------------------------------------------*/ }catch(Exception e){ } どうか、わかる方よろしくお願いします。

    • ベストアンサー
    • Java
  • Runtime.execについての質問

    こんにちは、Makotoと申します。 Runtime.execを使って、ディレクトリを作成する プログラムを作っているのですが、下記のプログラムで ディレクトリは作成されるのですが、コマンドプロンプト画面が 立ち上がったままになってしまいます。閉じようと思い、8行目でexitコマンド を発行してみたのですが、うまくいきませんでした。このウィンドウを閉じる 方法はあるのでしょうか? 1:public class test{ 2:  public static void main(String[] args) throws Exception { 3:    Runtime rt = Runtime.getRuntime(); 4:    Process pr; 5:    try { 6:      Process proc1 = rt.exec("cmd /C start /MIN 7:               mkdir c:\\\poi\\test"); 8:      proc1 = rt.exec("command.com, /, exit"); 9:    } catch (java.io.IOException e) { 10:     System.err.println(e); 11:     System.exit(1); 12:    } 13: 14: } 15:}

    • ベストアンサー
    • Java
  • Javaプログラムから外部コマンドを呼び出す

    String com = "ls -l"; Process pro = Runtime.getRuntime().exec(com); 上記のようにして、外部コマンドを実行しています。 この方法を使用すると投げたコマンドが終了してしまうまで、後の処理が行われません。 バックグラウンド処理を行いたかったので、 String com = "ls -l &"; Process pro = Runtime.getRuntime().exec(com); としてみましたが、結果は変わりませんでした。 何か別の指定方法が存在するのでしょうか。 ご存知の方、ぜひ教えてください。

    • ベストアンサー
    • Java
  • fork、exec系、wait系のシステムコール(ライブラリ関数)でのシェル

    簡単なシェルを fork、exec系、wait系のシステムコール(ライブラリ関数)を利用して作りたいですがどのようなソースになるでしょうか? 最低限、以下の機能を実現しなければなりません 1.プロンプトを出力する 2.ユーザに端末からコマンドを入力させる 3.新しくプロセスを生成し、そのプロセスが入力されたコマンドのプログラムを実行する 4.そのコマンドの実行(子プロセス)が終了するまでシェル(親プロセス)は、プロンプトを出さずに待つ 5.1に戻る どうやってもうまくいかないので教えていただけないでしょうか

  • JavaでCプログラムをコンパイルするには

    linux環境で、javaによって別に作ってあるCのプログラムをコンパイルしたいのですが、execを使用して、 Runtime.getRuntime().exec("cc sample.c"); とするとコンパイルできません。 恐らくコマンドプロンプトなどを起動して指定してやればできると思うのですが、現在linux環境にないのでわかりません。 gnome-terminalかなにかだったような気がするのですが・・・。 どなたか教えていただければ幸いです。

  • シェルが実行されません

    WWWユーザから、 Process process = Runtime.getRuntime().exec("java -classpath /xx/xx/xx /export/home/test/B001"); は動くのですが、 Process process = Runtime.getRuntime().exec("java /export/home/test/B001.sh"); のようにシェルを呼び出しても動作しません。 また、hulftのジョブ起動からもシェルが動かないのですが、原因は何が考えられますでしょうか? シェルのパーミッションは755なのですが・・

  • java わからない。

    今、卒業研究でJAVAを扱っています。 しかし、思った動作をするプログラムが作れません。 時間もなくなってきたので、okwaveに投稿しました。 お願いします。 パソコンはwindowsです。 プログラムを実行すると, (1)コマンドプロセッサでdirを実行してくれる。 (2)実行した後にファイルにする。 実行するときは[dir > dir.txt]のようにしたいです。 今まで書いてきた例をいかに描きます。 import java.io.*; public class TestExec1 { public static void main(String[] args) { try { String s1 = "dir"; Process process = Runtime.getRuntime().exec(s1); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } } どこが間違っているかわかりません。 よろしくお願いします。

  • exec を使ってcmdを動かす

    現在、javaのexec関数を使ってcmdを実行したいのですが、うまく動作しなくて困っています。 ソースコードで説明すると、 try { Runtime r = Runtime.getRuntime(); Process p=       r.exec(newString[{"cmd.exe","/k","del","a.txt"}); } catch { } この様なソースでcmdを立ち上げて、a.txtというファイルを消去したいのですが、このプログラムを実際に動かすとa.txtはきえず、またcmdの画面も表示されません。 しかし、エラーは表示されずまたcmd.exeをnotpad.exeに変更するとちゃんとnotpadが立ち上がります。 どのあたりのソースがおかしいのでしょうか?ご指摘お待ちしております。

    • ベストアンサー
    • Java
  • execでdirコマンドを実行すると停止します

    質問です。 javaのプログラム内で command = "cmd /c dir *.java /a-d"; r = Runtime.getRuntime(); p = r.exec(command); p.waitFor(); p.destroy(); こう書くと問題なく進行するのですが command = "cmd /c dir *.java /a-d/s"; r = Runtime.getRuntime(); p = r.exec(command); p.waitFor(); p.destroy(); のように/sオプション(サブディレクトリ内も検索する)を付けると p.waitfor(); 部分で動作が停止します。 ファイルの探索に時間がかかっているとかではなく、完全に動作が停止しているようなのですが原因がわかりません どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • ServletからバックグラウンドでJavaを走らせたい

    Javaのバッチをコマンドラインからでなく、Servletから非同期で走らせたいのですが、うまくいきません。 多数サイトを見ましたが引数なしの場合でも、JavaをServletのバックグラウンドで走らせる事はできませんでした。5時間はまっています(T_T) Process process = Runtime.getRuntime().exec("java C:\\java\\src\\batch\\testJava argv01 argv02"); ■環境は、JDK1.4.1、Tomoat4.1.6、Windos2000で、 javaを打ち間違えたら、例外が発生したのでjavaだけはとりあえずパスがとおっているようです。 よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう