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

时间:2011-03-02 14:25:43

标签: java permissions debian tomcat6 runtime.exec

我正在将我们的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();

似乎是调用外部程序的常用方法。它确实运行,在0中返回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 squeeze,没有任何配置修改:

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

我该如何解决这个问题? 或者至少我应该在哪里看?我用Google搜索了一切可以想象的原因,让Java以这种方式行为不端,但未能找到线索。

P.S。由于这是默认安装,因此在/etc/init.d/tomcat6

中禁用了Java安全管理器
# Use the Java security manager? (yes/no)
TOMCAT6_SECURITY=no

2 个答案:

答案 0 :(得分:2)

将您想要的操作放入单个可执行shell脚本中,然后exec shell脚本。

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

答案 1 :(得分:1)

不知道这个“echo test123> / tmp / tomcat6-tmp / 1”是否可以作为一个命令运行。我记得我有类似的问题,我不得不拆分它,所以尝试运行“echo test123”,然后获得一个带有命令输出的输入流。如果您有流,则可以轻松写入文件。

此外,您使用args执行命令,因此请尝试使用将数组作为参数的方法。