[Java] JDK 7u25: Solutions to Issues caused by changes to Runtime.exec
Jumat, 21 Juni 2013
0
komentar
https://blogs.oracle.com/thejavatutorials/entry/changes_to_runtime_exec_problems
Windowsプラットフォームで
Runtime.exec
に伴う問題に直面したJava開発者のために、Java engineeringチームが以下のサンプルを用意しました。Background
JDK 7u21で、以下のメソッドに指定するコマンド文字列のデコードがより厳密になりました。Runtime.exec(String)
Runtime.exec(String,String[])
Runtime.exec(String,String[],File)
JDK 7u21 Release Notes for more informationこれが原因で、アプリケーションに問題が発生する場合があります。以下のセクションで開発者が直面した問題と解決策をご紹介します。
http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.html#jruntime
[注意1]
JDK 7u25では、システムプロパティ
jdk.lang.Process.allowAmbigousCommands
を使ってチェックプロセスを緩和することができますので、変更できないアプリケーションの回避策として有効です。回避策はSecurityManager
を使わずに実行するアプリケーションに対してのみ有効です。詳細はJDK 7u25のリリースノートをご覧下さい。JDK 7u25 Release Notes for more information[注意2]
http://www.oracle.com/technetwork/java/javase/7u25-relnotes-1955741.html
Windows APIのCreateProcessの呼び出しに関する詳細を知るには、以下のページをご覧下さい。
CreateProcess function (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
Runtime.exec
の呼び出し方法は2種類あります。- 文字列としてコマンドを渡す場合
Runtime.exec(String command[, ...])
- 文字列の配列としてコマンドを渡す場合
Runtime.exec(String[] cmdarray [, ...] )
Problem 1: "The file path for the command includes spaces"
次のような呼び出しでは、引数を空白文字で分割し、以下のような文字列の配列にとして取り扱います。Runtime.getRuntime().exec("c:\\Program Files\\do.exe")
処理された配列の最初の要素を実行可能ファイル名として解釈し、(存在する場合には)c:\\Program, Files\\do.exe
SecurityManager
が検証し、実行可能パスの曖昧さを避けるため、引用符(”)で囲みます。この結果、間違ったコマンドになってしまいます。
これでは動きませんね。"c:\\Program" "Files\\do.exe"
Solution:
ProcessBuilder
もしくはRuntime.exec(String[] cmdarray [, ...] )
を使うか、実行可能パスを引用符で囲みましょう。アプリケーションコードを変更できず、
SecurityManager
を使っていない場合には、Javaプロパティjdk.lang.Process.allowAmbigousCommands
の値をコマンドラインからtrueに設定することで回避できます。これによりチェックプロセスが緩和され、曖昧な入力を許可します。-Djdk.lang.Process.allowAmbigousCommands=true
Examples:
new ProcessBuilder("c:\\Program Files\\do.exe").start()Runtime.getRuntime().exec(new String[]{"c:\\Program Files\\do.exe"})Runtime.getRuntime().exec("\"c:\\Program Files\\do.exe\"")
Problem 2: "Shell command/.bat/.cmd IO redirection"
以下のような暗黙のcmd.exe
呼び出しでは次のような間違ったコマンドに解釈してしまいます。Runtime.getRuntime().exec("dir > temp.txt")new ProcessBuilder("foo.bat", ">", "temp.txt").start()Runtime.getRuntime().exec(new String[]{"foo.cmd", ">", "temp.txt"})
"XXXX" ">" temp.txt
Solution:
コマンドを正しく指定するには、以下のオプションを使いましょう。もしくはRuntime.getRuntime().exec("cmd /C \"dir > temp.txt\"")new ProcessBuilder("cmd", "/C", "foo.bat > temp.txt").start()Runtime.getRuntime().exec(new String[]{"cmd", "/C", "foo.cmd > temp.txt"})
Process p = new ProcessBuilder("cmd", "/C" "XXX").redirectOutput(new File("temp.txt")).start();
Problem 3: "Group execution of shell command and/or .bat/.cmd files"
検証が強制されているため、以下の呼び出しの引数では間違ったコマンドを生成してしまいます。Runtime.getRuntime().exec("first.bat && second.bat")new ProcessBuilder("dir", "&&", "second.bat").start()Runtime.getRuntime().exec(new String[]{"dir", "|", "more"})
Solution:
コマンドを正しく指定するためには、以下のオプションを使いましょう。同じシナリオはRuntime.exec("cmd /C \"first.bat && second.bat\"")new ProcessBuilder("cmd", "/C", "dir && second.bat").start()Runtime.exec(new String[]{"cmd", "/C", "dir | more"})
cmd.exe
の持つ以下の演算子"&"
, "||"
, "^"
でも有効です。Problem 4: ".bat/.cmd with special DOS chars in quoted params”
検証が強制されているため、以下の呼び出しの引数では例外を発生させてしまいます。Runtime.getRuntime().exec("log.bat \">error<\"")new ProcessBuilder("log.bat", ">error<").start()Runtime.getRuntime().exec(new String[]{"log.bat", ">error<"})
Solution:
コマンドを正しく指定するには、以下のオプションを使いましょう。Runtime.getRuntime().exec("cmd /C log.bat \">error<\"")new ProcessBuilder("cmd", "/C", "log.bat", ">error<").start()Runtime.getRuntime().exec(new String[]{"cmd", "/C", "log.bat", ">error<"})
Examples:
次のようなシェルの複雑なリダイレクトは以下のようになります。cmd /c dir /b C:\ > "my lovely spaces.txt"
Runtime.getRuntime().exec(new String[]{"cmd", "/C", "dir \b >\"my lovely spaces.txt\"" });
The Golden Rule:
たいていの場合、cmd.exe
は2個の引数をとります。"/C"と解釈のためのコマンドです。
TERIMA KASIH ATAS KUNJUNGAN SAUDARA
Judul: [Java] JDK 7u25: Solutions to Issues caused by changes to Runtime.exec
Ditulis oleh Unknown
Rating Blog 5 dari 5
Semoga artikel ini bermanfaat bagi saudara. Jika ingin mengutip, baik itu sebagian atau keseluruhan dari isi artikel ini harap menyertakan link dofollow ke http://apk-zipalign.blogspot.com/2013/06/java-jdk-7u25-solutions-to-issues.html. Terima kasih sudah singgah membaca artikel ini.Ditulis oleh Unknown
Rating Blog 5 dari 5
0 komentar:
Posting Komentar