JAva呼び出しlinuxコマンド

2292 ワード

JAvaはRuntimeを適用する.exec呼び出しlinuxコマンド
次に、Unixでlsコマンドを実行する場合の簡単なクラスの例を示します.
  
 
 import java.io.BufferedInputStream; 
  import java.io.IOException; 
   
  public class ExecLs { 
   
   static public void main(String[] args) { 
   String cmd = "ls" 
   
   try { 
   Process ps = Runtime.getRuntime().exec(cmds); 
   System.out.print(loadStream(ps.getInputStream())); 
   System.err.print(loadStream(ps.getErrorStream())); 
   } catch(IOException ioe) { 
   ioe.printStackTrace(); 
   } 
   } 
   
   // read an input-stream into a String 
   static String loadStream(InputStream in) throws IOException { 
   int ptr = 0; 
   in = new BufferedInputStream(in); 
   StringBuffer buffer = new StringBuffer(); 
   while( (ptr = in.read()) != -1 ) { 
   buffer.append((char)ptr); 
   } 
   return buffer.toString(); 
   
   } 

上記のコードの重要な部分はexecメソッドとコマンド文字列lsである.このプログラムは、実行ディレクトリの下にあるリストの詳細を出力します.
  
では、これらの詳細をファイルにリダイレクトしたい場合はどうすればいいですか?このコマンドラインの入力はls>FILEと書くべきですが、cmd変数をこのように変更すると、次のように動作がエラーになります.
  
  /bin/ls: >: No such file or directory
  /bin/ls: FILE: No such file or directory
  
エラーの原因は、追加のパラメータが実際のコマンドラインではなくlsコマンドに直接転送されたことです.この問題を解決する方法は、cmd列を文字列配列にし、実行したいプログラムをコマンドshellに転送することです.
  
したがって、cmd行を次のように変更します.
  
   String[] cmd = { "sh", "-c", "ls > FILE"};
  
FILEというファイルが表示されます.ディレクトリのリストが表示されます.-cパラメータは、後続の文字列を読み込むように伝え、最後のパラメータは実行するスクリプトです.
  
この場合、パイプも良好に動作するので、コマンドを次の方法に変更できます.
  
  String[] cmd = { "/bin/sh", "-c", "/bin/ls | grep d > FILE"};
  
この形式では、lsエントリにdを含むファイルをFILEというファイルをあげます.shとlsのフルパスを与えることは、プログラムのセキュリティを提供するのに役立ちます.
  
Runtimeを使用するが.execはプラットフォームから独立したJavaを作成する最善の方法ではありませんが、必要な場合があります.このリダイレクト技術を用いることはRuntimeを脱出するのに役立つ.execの制限.
説明:
1.execは実行可能なプログラムである必要があり、コマンドラインのコマンドであれば別途処理する必要がある
2.Windowsでprocess=runtime.exec(new String[] { "cmd.exe","/C", "dir"});
3.linuxでprocess=runtime.exec(new String[] { "/bin/sh","-c", "echo $PATH"});