java - 从java执行shell脚本
问题描述
我想从java执行一个shell脚本。我有下一个代码
ProcessBuilder pb2 = null;
if (this.args.size() == 0) {
pb2 = new ProcessBuilder(file.getPath());
} else if (this.args.size() > 0) {
pb2 = new ProcessBuilder(file.getPath(), this.args.get(0));
}
Process p2;
p2 = pb2.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
log(line);
}
但我得到了Permission denied
。我曾尝试sh
在开头执行文件,但代码不起作用。
ProcessBuilder pb2 = null;
if (this.args.size() == 0) {
pb2 = new ProcessBuilder("sh", file.getPath());
} else if (this.args.size() > 0) {
pb2 = new ProcessBuilder("sh", file.getPath(), this.args.get(0));
}
Process p2;
p2 = pb2.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p2.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
log(line);
}
我可以允许它,chmod a+x
但想法是自动进行。
更新:我尝试了第一个代码file.setExecutable(true)
但没有任何反应,我没有得到Permission Denied
但文件没有执行
解决方案
如果要将文件作为 shell 脚本执行,则必须设置执行权限。没有办法解决这个问题。
如果您从 Java 应用程序创建脚本文件,那么您的应用程序可以在创建文件后更改文件权限。
如果某个用户正在上传此脚本,那么您需要非常非常确定您信任该用户。如果您从不值得信任的人那里接受了一个 shell 脚本,就会发生各种令人讨厌的事情。(这包括无辜但危险的错误的后果。)
更新:我尝试了第一个代码,
file.setExecutable(true)
但没有任何反应,我没有得到 Permission Denied 但文件没有执行。
发生了什么事。您已停止收到 Permission Denied 消息!
下一步将调试您正在生成/执行的脚本:
目测吧。检查“hash bang”行是否正确。寻找其他错误。
从脚本中捕获标准输出和标准错误,并检查错误。
在脚本中添加一些“跟踪打印”;例如
echo "here 1" >> /tmp/log
子进程是否在等待来自 Java 父进程的输入?
您是否在父进程中读取孩子的标准输出和标准错误?
推荐阅读
- python - 如何创建一个包含 threading.Event 和 multiprocessing.Event 的协议?
- github - GitHub Actions 不起作用奇怪的错误消息
- jquery - PWA - 在 iOS 上添加到主屏幕提示?
- r - 使用 R 中预先指定的函数组合列表的每个级别的元素
- c# - 重设密码 电子邮件未发送??电子邮件发件人适用于电子邮件确认,但不适用于密码重置
- docker - 在 EC2 上将 gRPC 与 Tensorflow Serving Docker 容器一起使用时出错
- python - 如何为两人对话改进 GCP 的 Speech to Text API 结果
- java - 仅当属性为空时,如何从 lombok 构建器中排除属性
- r - 如何转换坐标以保留数据框中的所有信息
- spring - Spring Annotations 是否应该在 @configuration 中的 @Bean 定义的类上工作?