【出错记录】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./work/Catalina/localhost/
所以只需要将该文件的目录主修改为你想要的用户,用该用户启动Tomcat就不会出现问题了。
四、总结
那么总结一下,大概就是Tomcat的用户权限问题需要格外关注$CATALINA_HOME/work/Catalina/localhost/目录下的文件主或组的权限问题
【出错记录】Tomcat非root用户启动无法拥有权限读写文件的更多相关文章
- 怎么让普通用户达到root用户也可以拥有权限修改文件(CentOS系统)
为什么会提出这个问题呢? 答:因为啊,比如我们在大数据集群搭建的时候,经常会需要配置环境变量,如/etc/profile.那么,问题来了,每次必须得都切换到root用户才能,但是呢,如何可以在普通用户 ...
- centos7新增用户并授权root权限、非root用户启动tomcat程序
一.centos7新增用户并授权root权限 cat /etc/redhat-release查看centos版本号 1.禁用root账户登录 vim /etc/ssh/sshd_config 找到这一 ...
- 二进制方式安装docker(非root用户启动docker)
二进制方式安装docker(非root用户启动docker) 一.下载安装包: 地址:https://download.docker.com/linux/static/stable/x86_64/ 这 ...
- docker 非root用户修改mount到容器的文件出现“Operation not permitted
使用环境centos7 x86-64 内核版本4.19.9 docker使用非root用户启动,daemon.json配置文件内容如下: # cat daemon.json { "usern ...
- 使用非root用户启动tomcat
以下操作均为以root用户运行1.添加tomcat用户组 /usr/sbin/groupadd tomcat 2.添加tomcat用户,并限制登录 /usr/sbin/useradd -s /bin/ ...
- Ubuntu配置Tomcat9非root用户启动
unix类系统的root用户具有极大的权利,所以很多时候我们不希望程序以root身份启动,这也就是配置Tomcat以指定身份(非root)启动的初衷,虽然也没人来攻击我的服务器,但本着学习学习的目的, ...
- 短网址资料-nginx非root用户启动-systemctl启动脚本-分割root权限
https://www.cnblogs.com/aspnethot/articles/3492191.htmlhttps://www.cnblogs.com/aspnethot/articles/34 ...
- Centos6.4 设置开机自动以某个非root用户启动脚本
开机自动运行脚本,可以将脚本的执行命令放在 /etc/rc.d/rc.local 文件中,但是这样开机自动运行这个脚本的用户默认为root. 如果想以某个非root用户运行脚本,可以使用如下命令: s ...
- fedora 非root用户访问socket 没用权限
在非root用户下执行基于Libpcap库编写的应用程序时不能正常运行,原因是由于libpcap库使用raw socket的套接字.而Raw Socket的使用需要root权限,否则raw socke ...
随机推荐
- Wu反走样算法绘制直线段
Wu反走样算法 原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果.因为人眼看到的是线附近亮度的平均值. M ...
- (网页)css和js的版本号问题
HTML页面自动清理js.css文件的缓存,之前用的是?v=11每次都要找寻到网页进行更改,非常的麻烦. <script type="text/javascript"> ...
- Git多人协作常用命令
Git多人协作工作模式: 首先,可以试图用git push origin branch-name推送自己的修改. 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并. 如果 ...
- SQLServer基础之数据页类型:GAM,SGAM,PFS
简介 我们已经知道SQL Server IO最小的单位是页,连续的8个页是一个区.SQL Server需要一种方式来知道其所管辖的数据库中的空间使用情况,这就是GAM页和SGAM页. GAM页 GAM ...
- C# -- 使用XmlDocument或XDocument创建xml文件
使用XmlDocument或XDocument创建xml文件 需引用:System.Xml; System.Xml.Linq; 1.使用XmlDocument创建xml(入门案例) static vo ...
- 力扣算法题—060第K个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...
- Angular之模态弹窗ui-bootstrap-modal及轻量级弹窗ngDialog
ui-bootstrap 中模态 官网 angular-ui-bootstrap 对于ui-bootstrap集成大量指令如折叠ui.bootstrap.accordion.时间插件ui.boot ...
- Nmap参考指南(Man Page)
Table of Contents 描述 译注 选项概要 目标说明 主机发现 端口扫描基础 端口扫描技术 端口说明和扫描顺序 服务和版本探测 操作系统探测 时间和性能 防火墙/IDS躲避和哄骗 输出 ...
- 《Java大学教程》--第1章 步入Java世界
1.2 软件:用于计算机执行的指令的集合称之为程序(program).单个程序或者一组程序称之为软件(software)1.3 编译:计算机的语言称为机器码(machine code).用编译器(co ...
- bsp 总结
_board_128.c里放硬件不同的东西,如gpio等 product下code里面的cspkernel里面放内核模块补充的
