为什么Runtime.getRuntime()。exec在Tomcat中以root身份分配进程?

时间:2013-04-10 12:12:44

标签: java python tomcat debian exec

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

我正在使用官方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)时,它在生产环境中失败。它以某种方式无法访问本地应用程序。同样,在我的开发环境中一切正常。这与我的观察有关吗?

1 个答案:

答案 0 :(得分:2)

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

尝试使用os.getuid()pwd.getpwuid(os.getuid()) - 这会给您带来另一个结果。

我觉得这个过程在某种程度上获得了root权限是非常不可能的。