我正在使用Runtime.getRuntime().exec(...)从Tomcat webapp应用程序中执行python脚本。当我在我的开发环境中(Eclipse通过Sysdeo-Plugin运行我本地的Tomcat (位于/home/me/opt/tomcat)时,一切都很顺利)。当我在生产环境中运行我的webapp时,出现了这个问题(= Debian Squeeze)。
我使用的是官方debian包中的tomcat6。它是使用用户"tomcat6“(通过"ps aux | grep tomcat6”验证)通过/etc/init.d自动启动的。我正在执行我的简单python脚本:
Process p = Runtime.getRuntime().exec("python /home/me/exec-test.py")
p.waitFor();
//read the stdout and stderrpython脚本很简单:
#!/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)的同一用户吗?我是不是漏掉了什么,或者可能是为了获取进程的user的python调用是不正确的?
我也尝试过使用Apache Commons Exec,也得到了同样的结果。
结果是,当我使用更复杂的python脚本调用本地应用程序(/usr/ local /bin/local-app)时,它在生产环境中失败。不知何故,它无法访问local-app。同样,在我的开发环境中一切正常。这与我的观察结果有关吗?
发布于 2013-04-10 20:27:22
getpass.getuser()首先查看环境变量'LOGNAME', 'USER', 'LNAME', 'USERNAME' (按此顺序),然后再尝试其他变量,可能其中一个设置不正确。
尝试使用os.getuid()或pwd.getpwuid(os.getuid()) -这应该会给出另一个结果。
我发现进程以某种方式获得root权限是非常不可能的。
https://stackoverflow.com/questions/15925481
复制相似问题