所以我遇到了以下问题:我有一个在 Linux 上的 Tomcat7 服务器中运行的 Web 服务。然而,Web 服务必须执行一些命令(主要是文件操作,例如复制和装载)。复制 我已经用 java.nio 替换了,但我认为 mount
没有替代品.
所以我正在尝试从我的 Tomcat Java 进程中执行 shell 命令。不幸的是,它不执行我的命令。我以前用Java实现过shell命令的执行。所以我的代码应该是正确的:
Process pr = Runtime.getRuntime().exec("mount -o loop -t iso9660 <myimage> <mymountpoint>");
pr.waitFor();
<myimage>
和 <mymountpoint>
是绝对路径,所以也没有问题。
- 我调试了我的命令,它们在控制台上执行时正常工作。
- 我试过发送其他命令。简单的命令,例如
id
和pwd
正在工作! - 我试过使用
/bin/bash -c "<command>"
,但没有用。 - 我已经尝试执行一个 shell 脚本,该脚本执行命令,但没有用。
- 我试过在我的命令中转义空格,但没有用。
所以我已经深入挖掘,现在我怀疑某些 Tomcat 安全策略(沙盒?)阻止我执行命令。由于安全对我来说不是问题(它是一个内部系统,与外界完全隔离),我尝试了一种 hack,最近变得非常流行:
System.setSecurityManager(null);
这也没有用。我在 RHEL6 上使用 Java7 和 Tomcat7。 Tomcat7刚刚解压!我在/etc/.. 或除/opt/tomcat/之外的任何其他文件夹中没有任何文件,我从 Tomcat 主页中提取了 zip。我在/opt/tomcat/conf 文件夹中搜索了安全设置,但我只能找到文件 catalina.policy,我似乎无法在其中为 shell 命令设置一些安全级别。
有什么想法吗?
最佳答案
一些事情:
System.setSecurityManager(null);
您刚刚破坏了应用程序的安全性。
Yes, Tomcat is running as root. If I execute id I'm root as well.
立即解决这个问题!
现在进入正题。你不应该让 Tomcat 执行任何事情,你需要将它推迟到一个单独的进程,无论是 shell 脚本还是另一个 Java 程序。这也应该消除(我希望)对运行 Tomcat 的根的依赖。应该可以以无法正常登录系统的非特权用户身份执行此命令。您可以通过配置 /etc/fstab
并为同一用户提供执行此操作的权限来执行此操作。从纯安全 POV 来看,挂载的进程不应由 tomcat 用户拥有。 tomcat 用户也不应该是 root。总结一下:
1) 停止以 root 身份运行 Tomcat
2) 在 Tomcat 上下文之外创建一个单独的进程来运行此挂载
3)创建一个tomcat用户,这个用户不能登录系统,也不能是特权用户(管理员, super 用户等)
4)创建一个进程用户,这个用户要和tomcat用户一样配置
5) 编辑 /etc/fstab
为进程用户提供正确挂载所需的权限。
关于java - 在Tomcat中执行shell命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533799/