我正在使用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)时,它在生产环境中失败。它以某种方式无法访问本地应用程序。同样,在我的开发环境中一切正常。这与我的观察有关吗?
答案 0 :(得分:2)
getpass.getuser()
在尝试其他任何操作之前首先查看环境变量'LOGNAME', 'USER', 'LNAME', 'USERNAME'
(按此顺序),可能其中一个设置不正确。
尝试使用os.getuid()
或pwd.getpwuid(os.getuid())
- 这会给您带来另一个结果。
我觉得这个过程在某种程度上获得了root权限是非常不可能的。