我正在将我们的 servlet(纯 Java,在 Tomcat 6 中运行)从 CentOS 移动到 Debian,并面临使用Runtime.exec()
.
(该命令应该是 ImageMagickconvert
在生产中的,但我已经简化了查找问题根源的调用,因此以下所有代码echo
都经过测试并且不能正常工作)。
String command = "echo test123 > /tmp/tomcat6-tmp/1";
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command);
int exitVal = process.waitFor();
似乎是调用外部程序的非常常见的方式。它确实运行,返回0
in exitVal
,但无法创建文件并将文本放入其中。
低级方法也是如此:
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()
在相同的上下文中正常执行。
我使用从软件包安装的 tomcat6 全新安装的 debian 挤压,没有对配置进行任何修改:
$ aptitude show tomcat6
Package: tomcat6
State: installed
Version: 6.0.28-9+squeeze1
.....
$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l
我该如何解决这个问题?或者至少我应该去哪里看?我已经搜索了 Java 以这种方式行为不端的所有可以想象的原因,但未能找到线索。
PS由于这是默认安装,Java 安全管理器在/etc/init.d/tomcat6
# Use the Java security manager? (yes/no)
TOMCAT6_SECURITY=no