加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java,Runtime.exec或ProcessBuilder:如何知道文件是shell还是二

发布时间:2020-12-14 16:23:52 所属栏目:Java 来源:网络整理
导读:我正在寻找一种最有效的方式来决定: 我应该预先提供用户提供的命令行与shell可执行文件 如果是,那可执行文件是什么? (/ bin / sh?/usr/bin/perl?/usr/bin/ksh?c:/../ cmd.exe?) 众所周知,要从Java启动shell脚本,应该启动shell: ProcessBuilder pb =
我正在寻找一种最有效的方式来决定:

>我应该预先提供用户提供的命令行与shell可执行文件
>如果是,那可执行文件是什么? (/ bin / sh?/usr/bin/perl?/usr/bin/ksh?c:/../ cmd.exe?)

众所周知,要从Java启动shell脚本,应该启动shell:

ProcessBuilder pb = new ProcessBuilder("/bin/sh","script.sh","arg1","arg2);

要启动一个二进制文件,应该启动二进制本身:

ProcessBuilder pb = new ProcessBuilder("/path/binary","arg2);

如果使用shell执行二进制文件,则会产生错误:

ProcessBuilder pb = new ProcessBuilder("/bin/sh","/path/binary","arg2);
(sh: cannot execute binary file)

如果shell脚本在没有shell二进制的情况下执行,则会产生错误:

ProcessBuilder pb = new ProcessBuilder("script.sh","arg2);
(error 2: file not found)

我处于一种情况,我的应用程序不知道它的开始,二进制或脚本.

已启动的应用程序是由最终用户提供的事件处理程序.它最有可能是在Unix下执行的shell脚本;但它可以是Windows下的* .cmd,或者在某些晦涩的平台下执行的Perl脚本.毕竟是Java.

我的第一个天真的尝试是用shell启动命令行,看看它是否有效.如果没有,请尝试以二进制形式执行.

这是丑陋和危险的:在平台和shell的一些未知的组合下,第二次运行可能仍然执行脚本,第二次,具有不可预测的结果.

另外,当我无法启动它时,我无法确定脚本何时启动,并且由于自身的某些问题而失败.

我现在考虑的最好的事情是:

>阅读脚本并查找任何不可打印的字节
>如果找到,认为它是一个二进制
>如果没有,添加/ bin / sh(或cmd.exe如果在Windows下)

请告知您是否有更好的想法.

更新/部分解决方案

感谢所有与我分享他们想法的人.

原来,我已经困惑了自己和互联网的其余部分:)

在用户输入的命令行之前,不需要在前面加上二进制文件:

>脚本在PATH中
>(对于Unix)脚本是可执行的
>(对于Unix),脚本具有#!/ path / to / interpreter

当我测试我的代码时,这些条件中的一个或另一个没有达到.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读