首页 >Java >java教程 >为什么 `Runtime.exec(String)` 失败,如何在 Java 中可靠地执行系统命令?

为什么 `Runtime.exec(String)` 失败,如何在 Java 中可靠地执行系统命令?

Barbara Streisand
Barbara Streisand原创
2024-12-03 12:44:10220浏览

Why Does `Runtime.exec(String)` Fail, and How Can I Reliably Execute System Commands in Java?

Runtime.exec(String) 异常:了解命令执行中的差异

Runtime.exec(String) 提供了一种从 Java 程序执行系统命令的方法。然而,用户可能会遇到执行结果的差异,某些命令成功,而其他命令失败或行为异常。本文探讨了这些异常的根本原因,并探讨了可靠命令执行的替代方法。

命令失败机制

命令在依赖所提供的基本服务时会失败通过 shell,Runtime.exec(String) 不使用 shell。这些服务包括:

  • 引用和空格分割: shell 正确解释引用的字符串并将它们保留为单个参数,而 Runtime.exec(String) 天真地根据空格分割命令.
  • 全局扩展: shell 扩展通配符和全局(例如,*.doc)到匹配文件列表中,而 Runtime.exec(String) 只是将它们作为参数传递。
  • 重定向和管道: Shell 处理重定向(例如,> ;) 和管道(例如 |)操作,而 Runtime.exec(String) 则不会
  • 变量和命令扩展: Shell 扩展环境变量($HOME)和命令(例如 pwd),而 Runtime.exec(String) 将它们视为文字字符串。

预计时间失败

只要使用上述任何 shell 功能,命令就会失败。常见场景包括:

-带有空格或特殊字符的文件名
-通配符或通配符
-输入/输出重定向
-环境变量或命令扩展

< ;h3>解决方案

存在两种主要方法为了规避这些异常并可靠地执行命令:

委托给 Shell(简单但有缺陷):
一种选择是将执行委托给 shell,例如 bash,它处理所有必要的服务。然而,这种方法可能会带来安全风险并损害稳健性。

Shell 替换(安全且稳健):
更安全、稳健的方法是承担 shell 的职责。这涉及了解 Unix 执行模型、shell 提供的服务以及如何以编程方式复制它们。 ProcessBuilder 提供了一种通过手动处理分词、变量扩展和重定向来实现此目的的方法。

以上是为什么 `Runtime.exec(String)` 失败,如何在 Java 中可靠地执行系统命令?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn