java - 为什么 Runtime.getRuntime().exec 在 Tomcat 中以 root 身份 fork 进程?

标签 java python tomcat debian exec

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

我使用官方 debian 软件包中的 tomcat6。它使用用户“tomcat6”通过/etc/init.d 自动启动(使用“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 脚本的 fork 执行是以“root”身份运行的?难道不应该是拥有 tomcat6 进程(=运行 JVM)的同一个用户吗?我是否遗漏了某些内容,或者获取进程用户的 python 调用可能不正确?

我也尝试过使用Apache Commons Exec具有相同的结果。

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

最佳答案

getpass.getuser() 在尝试之前首先查看环境变量 'LOGNAME', 'USER', 'LNAME', 'USERNAME' (按顺序)其他任何东西,也许其中之一设置不正确。

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

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

关于java - 为什么 Runtime.getRuntime().exec 在 Tomcat 中以 root 身份 fork 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15925481/

相关文章:

java - javax.persistence.metamodel.Map 和 java.util.Map 有什么区别?

java - 为 Epoch 使用不同的初始日期

python - 从 Graphlab SFrame 的特定列中查找具有 "Not Applicable"值的行

python - 无法加载插件 : sqlalchemy. 方言:sqlite3

java - tomcat中带有命名参数的IllegalStateException

apache - Apache httpd 和 Tomcat 是否共享同一个线程池?

java - JAXB 注释

python - 使用线程保持 FTP 控制端口处于事件状态

存储驱动器中的 Tomcat

java - Struts + hibernate : large memory consumption arise during reading big data arrays