首页 > 编程问答 >为什么 Runtime.getRuntime().exec 在 Tomcat 中以 root 身份分叉进程?

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

时间:2024-07-24 04:49:14浏览次数:8  
标签: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脚本以“root”身份运行?难道不应该是拥有 tomcat6 进程(=运行 JVM)的同一个用户吗?我是否遗漏了某些内容,或者获取进程用户的 python 调用不正确?

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

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


问题在于, Tomcat 进程自身并没有以 root 身份启动 Python 脚本,而是继承了启动 Tomcat 的用户的权限

在你的生产环境中,Tomcat 是以 root 身份启动的 (使用 /etc/init.d ),这是一种常见的做法,以便 Tomcat 可以绑定到特权端口(例如 80 和 443)。 然而, 即使 Tomcat 本身以 root 身份运行,它也会降低其子进程的权限 ,包括你的 Java 代码启动的 Python 脚本。

你的 Python 脚本显示为以 root 身份运行的原因是你的 /etc/init.d 启动脚本没有明确地将用户切换到 tomcat6 。因此,启动的 Python 脚本继承了启动脚本的权限,即 root 用户。

为了解决这个问题,你需要修改你的 /etc/init.d 脚本,以便在启动 Tomcat 之前将用户切换到 tomcat6 。 你可以使用 su 或者 sudo 命令来实现这一点。以下是一个使用 su 命令的示例:

# ... 其他启动脚本内容 ...

su - tomcat6 -c "/usr/bin/java ... [Tomcat 启动命令]"

# ... 其他启动脚本内容 ...

修改完启动脚本后,重启 Tomcat,然后再次运行你的 web 应用程序。 现在,你的 Python 脚本应该会以 tomcat6 用户的身份运行,并且你应该能够访问 /usr/local/bin/local-app

此外,为了安全起见, 不建议以 root 身份运行 Tomcat 。 如果你不需要绑定到特权端口,最好配置 Tomcat 以使用非特权用户运行。

标签:java,python,tomcat,debian,exec
From: 15925481

相关文章

  • 在Python中调整pdf页面大小
    我正在使用python裁剪pdf页面。一切正常,但如何更改页面大小(宽度)?这是我的裁剪代码:input=PdfFileReader(file('my.pdf','rb'))p=input.getPage(1)(w,h)=p.mediaBox.upperRightp.mediaBox.upperRight=(w/4,h)output.addPage(p)当我裁剪页面时,我也需要......
  • 如何使用 python 更改资源管理器窗口中的路径?
    没有人知道如何在不使用python打开新实例的情况下更改资源管理器窗口中的当前路径吗?例如,如果用户使用C:\Users\User打开资源管理器窗口。然后我必须将该路径更改为C:\Windows\System32例如。提前致谢。很遗憾,无法直接使用Python更改现有文件资源管理器窗口的......
  • python 以及将数组传递给函数的问题
    我需要求解一些常微分方程$\frac{dy}{dx}=f(x)=x^2ln(x)$并继续在限制0之间创建数组xpt。<=xpt<=2因为我必须小心xpt=0,所以我将函数定义如下deff(x):ifx<=1.e-6:return0.else:returnnp.square(x)*np.log(x)我的调用程序读取Np......
  • 如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“
    我有一个简单的脚本,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:此操作无法完成,因为该文件已在另一个程......
  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......
  • Python tkinter 窗口不断关闭,我不知道为什么
    我正在尝试制作一个有趣的小程序,其中每小时左右就会有一只毛茸茸的动物走过屏幕。我有一个主窗口,它启动一个循环,每小时左右播放一次动画/声音,但是在口袋妖怪第一次完成行走后,整个程序就会结束。我认为这可能与我设置tkinter窗口的方式有关,但我无法弄清楚。我认为在这里包含......
  • 用于自动访问 MongoDB Atlas CLI 的 Python 脚本
    我想编写一个Python脚本,以便普通用户可以访问他的数据库并从他的终端执行CRUD操作。我正在查看官方文档,但我有点迷失。有人可以给我指点基本教程来开始吗?当然,以下是如何构建Python脚本来访问MongoDBAtlasCLI的基本教程:先决条件:MongoDBAtlas......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • python猜数字游戏
    好的,下面是一个简单的小游戏代码示例,使用Python编写。这个游戏是一个猜数字游戏,玩家需要猜一个1到100之间的随机数。importrandomdefguess_number_game():print("欢迎来到猜数字游戏!")print("我已经想好了一个1到100之间的数字,请你猜一猜。")secret_num......
  • Java之this关键字详解
    this关键字在类中的普通成员方法中,可以使用this关键字,其表示调用当前方法的对象引用,即哪个对象调用该方法,this就代表哪一个对象。this关键字用法:对成员变量和局部变量进行区分固定格式:this.数据成员;调用类中的成员方法固定格式:this.成员方法(实际参数列表);调用......