gpt4 book ai didi

java - tomcat6 中的 Runtime.exec() 成功,但无法访问任何文件

转载 作者:行者123 更新时间:2023-12-02 00:45:13 25 4
gpt4 key购买 nike

我正在将 servlet(纯 Java,在 Tomcat 6 中运行)从 CentOS 迁移到 Debian,并遇到了使用 Runtime.exec() 执行命令的问题。
(在生产中该命令应该是 ImageMagick 的 convert ,但我已经简化了调用以查找问题根源,因此以下所有带有 echo 的代码都经过测试,但无法正常工作好吧)。

String command = "echo test123 > /tmp/tomcat6-tmp/1";
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
int exitVal = process.waitFor();

似乎是调用外部程序的非常常见的方式。它确实运行,在 exitVal 中返回 0,但无法创建文件并将文本放入其中。
低级方法也是如此:

ProcessBuilder pb = new ProcessBuilder("echo", "test123 > /tmp/tomcat6-tmp/3");
Process process = pb.start();
int resInt = process.waitFor();

但是可以创建一个文件并使用放置在同一方法中的 Java 代码在其中放入一些文本:

String fname = "/tmp/tomcat6-tmp/2";
File file = new File(fname);
file.createNewFile();
FileWriter fileWriter = new FileWriter(file);
fileWriter.write("test123");
fileWriter.close();

Runtime.exec("whoami")成功返回tomcat6,文件夹/tmp/tomcat6-tmp/确实存在,所有权限设置正确。

$ ls -al /tmp/tomcat6-tmp/
total 60
drwxr-xr-x 2 tomcat6 root 4096 Mar 2 15:26 .
drwxrwxrwt 6 root root 4096 Mar 2 15:25 ..
-rw-r--r-- 1 tomcat6 tomcat6 7 Mar 2 15:26 2

所有不需要访问系统中文件的命令似乎都可以在相同的上下文中使用 Runtime.exec() 正常执行。

我使用全新安装的 debian squeeze 和从软件包安装的 tomcat6,没有对配置进行任何修改:

$ aptitude show tomcat6
Package: tomcat6
State: installed
Version: 6.0.28-9+squeeze1
.....
$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l

如何解决这个问题?或者至少我应该看哪里?我用谷歌搜索了 Java 出现这种错误行为的所有可以想象的原因,但没有找到任何线索。

P.S. 由于这是默认安装,Java 安全管理器在 /etc/init.d/tomcat6 中被禁用

# Use the Java security manager? (yes/no)
TOMCAT6_SECURITY=no

最佳答案

将所需的操作放入单个可执行 shell 脚本中,然后 exec 该 shell 脚本。

Java 的 Runtime.exec()exec 系统调用的包装器,它将直接运行进程,而不是在子 shell 下运行。 > 重定向由 shell 执行,并且不能作为直接 exec 进程的参数。

关于java - tomcat6 中的 Runtime.exec() 成功,但无法访问任何文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5168806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com