• 【出错记录】Tomcat非root用户启动无法拥有权限读写文件


    简单记录下,如有必要,将深入补充:

    一、非root用户运行Tomcat及原因

    由于项目中,为了安全需要,Tomcat将禁止以root形式启动,原因很简单,举个例子,一旦有人恶意将jsp文件透过某个别的漏洞传到你的服务器中,那么你的程序运行过程中,将会远端被别人恶意执行代码,轻则服务器被黑,重则通过这台跳板进入你的后台,病毒式的入侵到内网的其他机器(例如大量的Redis以及MongoDB置于内网时是不设置密码的),所以以非root的方式启动Tomcat对于商用的环境下,是必须的。

    默认的情况下,Linux中的Tomcat都由bin目录下的catalina.sh执行,那么Tomcat的启动用户就由有权限启动Tomcat的运行命令的人:

    ./catalina.sh start

    如果希望是非root用户启动,可以通过递归改变文件主以及文件所属的组获得执行权限

    chown -R user1 ./apache-tomcat-xxx

    即如果是以root权限启动的Tomcat服务,使用如下命令:

    ps -ef|grep tomcat

    查看到你的Tomcat以什么权限启动的,看到启动主为红线标注角色:

    那么下面我使用非root用户启动下:

    二、非root用户文件操作被禁止

    我的问题是Web项目所有的一切功能正常使用,但是在一处与SpringMVC的MultipartFile文件接收的Controller报错如下:

    Processing of multipart/form-data request failed. /usr/local/apache-tomcat-9.0.4/work/Catalina/localhost/EDoctor/upload_50259820_2122_4f77_af6d_17f1fd261a13_00000001.tmp (Permission denied)

    以及在出错堆栈的打印中看到Permission denied和IOException其实本能想到是权限的问题,由于可以使用非root用户运行tomcat,但是现在重点是,Tomcat中存放tmp中间文件的目录到底在哪里?

    三、解决方法

    其实Tomcat中有一个work目录,其作用的话主要有下面两点:

    • jsp运行时都要先转换成servlet,tomcat容器启动时会在目录下的work目录中生成一系列的文件夹和.java文件和编译后的.class文件。
    • jsp最终转化为servlet,work的作用就是加快速度,如果jsp没有变化(依据时间戳)就不再重新编译。

    可以看到大概意思是work是Tomcat的工作目录,一般我们注重权限以为是webapp目录下的权限问题,其实还有一个权限就是真正的中间文件生成的工作目录:

    /usr/local/apache-tomcat-9.0.4/work/Catalina/localhost/

    所以只需要将该文件的目录主修改为你想要的用户,用该用户启动Tomcat就不会出现问题了。

     四、总结

    那么总结一下,大概就是Tomcat的用户权限问题需要格外关注$CATALINA_HOME/work/Catalina/localhost/目录下的文件主或组的权限问题

  • 相关阅读:
    parted 2T以上磁盘分区和挂载
    MySQL 表空间恢复
    MySQL 绿色版安装
    EF core
    让vs自动提示没有using的类
    Android Studio 的 Gradle 面板没有 Task
    JMS微服务远程调用性能测试 vs .Net Core gRPC服务
    electron打包,使用electron-packager
    EasyNetQ(RabbitMQ)在处理消息时,如果抛出异常,继续不断发送到订阅队列,不断处理(也就是不自动确认消息已到达)
    调用系统默认浏览器,打开网页
  • 原文地址:https://www.cnblogs.com/letcafe/p/tomcatWorkPermissionDenied.html
Copyright © 2020-2023  润新知