java - Shell 脚本在 linux 系统上工作正常,但不能在 Windows 机器上运行
问题描述
我在 Windows 机器上运行一个 java 项目,它读取 shell 脚本文件以获取授权令牌,但出现以下错误:
java.io.IOException:无法运行程序“./token.sh”:CreateProcess 错误=193,%1 不是有效的 Win32 应用程序
Java program for reading the shell script:
private static String execCommand(String username){
String line;
Process p = Runtime.getRuntime().exec("./token.sh -u " + username + " -p password123");
BufferedReader input = new BufferedReader(new
InputStreamReader(p.getInputStream()));
StringBuilder output = new StringBuilder();
while ((line = input.readLine()) != null) {
output.append(line);
}
我如何在 Windows 机器上运行相同的代码。
解决方案
它不会。您会看到 Windows CMD 和 Shell 中使用的命令是不同的,因为它们是完全不同的平台。即使您使用 java 执行,由于底层的根本差异,它也不会执行。从你得到的异常中可以很清楚地看到。
你能做什么?
通读 token.sh。很可能内部实现可以在 Windows 中实现。然后创建一个 if 条件来检查
System.getProperty("os.name")
Then 如果它的窗口然后调用 bat 文件,如果操作系统是基于 unix 的调用 sh 文件。对于每个其他操作系统,都会抛出一个有效异常。其他可能的方式是,如果生成的令牌独立于机器,您可以使用 SSH(JSch 或类似)远程连接到 UNIX 服务器并获取令牌。如果令牌依赖于机器(如果它是身份验证令牌,那么可能是),请尝试使用 Cygwin 解释器,它本身并不能保证每个 shell 文件都会在其中运行。
- 将 sh 文件及其实现更改为 python 或 ruby。然后可以在机器上安装相应的解释器(它实际上可能有,生产机器除外)。
- 用 Java 本身编写 sh 逻辑而不是保留脚本文件,因为平台独立性实际上是这里的要求,并且您已经在两台机器上启动并运行了 JRE。
推荐阅读
- python - python wmi EnableDHCP() 返回 0,但不起作用
- webauthn - 如何区分 FIDO2 设备
- ios - SwiftUI Bizarre MapKit makeUIView 行为
- c# - OnPost 后重定向到上一个过滤页面
- python - 忽略 Python pandas 中的 FutureWarnings
- c++ - 如何在 C++ 中检查字符串的特定条件
- css - 如何覆盖特定元素的属性
- python - 如何在 igraph for python 中调整节点标签的角度
- reactjs - 更新 React 后不会重定向
- apache - Apache HTTP 服务器重定向到端口 8085 IF url 包含“演示” ELSE 重定向到端口 8080