【问题标题】:Why is Runtime.getRuntime().exec forking a process as root in Tomcat?为什么 Runtime.getRuntime().exec 在 Tomcat 中以 root 身份分叉一个进程?
【发布时间】:2013-04-10 12:12:43
【问题描述】:

我正在使用 Runtime.getRuntime().exec(...) 从 Tomcat webapp 中执行 python 脚本。当我在我的开发环境中时一切都很好(Eclipse 通过 Sysdeo-Plugin 运行我的本地 Tomcat(位于 /home/me/opt/tomcat))。当我在生产环境 (= Debian Squeeze) 中运行我的 web 应用程序时会出现此问题。

我正在使用官方 debian 软件包中的 tomcat6。它通过 /etc/init.d 使用用户“tomcat6”自动启动(使用“ps aux | grep tomcat6”验证)。我正在执行我的简单 python 脚本:

Process p = Runtime.getRuntime().exec("python /home/me/exec-test.py")
p.waitFor();
//read the stdout and stderr

python 脚本很简单:

#!/usr/bin/python
import sys, os, getpass

def main(argv):
    print "Working dir: " +os.getcwd()
    userShell = os.environ.get('SHELL')
    print "$SHELL set to: " +userShell
    print "Executing as user: "+getpass.getuser()

if __name__ == "__main__":
    main(sys.argv[1:])

如果从eclipse运行tomcat的输出是:

Working dir: /home/me/opt/tomcat
$SHELL set to: /bin/bash
Executing as user: me

使用 debian 包中的 tomcat6 运行时:

Working dir: /var/lib/tomcat6
$SHELL set to: /bin/bash
Executing as user: root

为什么 python 脚本的分叉执行是以“root”身份运行的?拥有tomcat6进程(=运行JVM)的用户不应该是同一个用户吗?我是否遗漏了什么,或者获取进程用户的 python 调用不正确?

我也尝试过使用Apache Commons Exec,结果相同。

结果是,当我使用更复杂的 python 脚本调用本地应用程序 (/usr/local/bin/local-app) 时,它在生产环境中失败。它以某种方式无法访问本地应用程序。同样,在我的开发环境中一切正常。这与我的观察有关吗?

【问题讨论】:

  • 愚蠢的问题 - tomcat6 是否以 root 身份运行? Java 代码中的System.getProperty("user.name") 会返回什么?
  • @durron597:忘了说,我的错。 System.getProperty("user.name") 以“tomcat6”响应。
  • 我几乎想知道这个问题是否应该迁移到 serverfault,我认为这不是 Java/Python 问题。
  • 对于我遇到的python问题,我认为它已经解决了。但是上一段中描述的问题可能更适合 serverfault,你的权利。

标签: java python tomcat debian exec


【解决方案1】:

getpass.getuser() 在尝试其他任何操作之前首先查看环境变量'LOGNAME', 'USER', 'LNAME', 'USERNAME'(按此顺序),可能其中一个设置不正确。

尝试使用os.getuid()pwd.getpwuid(os.getuid()) - 这应该会给你另一个结果。

我发现进程以某种方式获得 root 权限的可能性极小。

【讨论】:

  • 确实如此:os.getuid() 返回“tomcat6”的 id。谢谢!我应该首先拥有 getpass.getuser() 的 rtfm :-) 不过,我有上一段中描述的问题。有什么提示吗?
  • tomcat 进程必须具有执行应用程序所需的访问权限,因此您应该检查一下。如果不知道您的应用程序在做什么(并且可能会看到一些代码),很难说更多。如果问题仍然存在,也许您应该为此打开一个新问题并发布一些代码。
  • 我同意mata,你应该在执行权问题上开一个新问题,除了我认为它应该是服务器故障。看起来你已经同意你的其他评论了
  • 同意。谢谢大家的快速帮助,我想我会从这里开始的!
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多