【出错记录】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 ...
随机推荐
- WPF:自定义Metro样式文件夹选择对话框FolderBrowserDialog
1.前言 WPF并没有文件选择对话框,要用也就只有使用Winform版的控件.至今我也没有寻找到一个WPF版本的文件选择对话框. 可能是我眼浊,如果各位知道有功能比较健全的WPF版文件选择对话框.文件 ...
- git 入门教程之安装 git
安装 git git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行,根据自身环境选择安装. Linux 系统 linux 系统安装软件大致有两种途径,一种是利用 ...
- matlab练习程序(神经网络分类)
注:这里的练习鉴于当时理解不完全,可能会有些错误,关于神经网络的实践可以参考我的这篇博文 这里的代码只是简单的练习,不涉及代码优化,也不涉及神经网络优化,所以我用了最能体现原理的方式来写的代码. 激活 ...
- 第一次使用VS Code时你应该知道的一切配置
前言 本文最新内容将在GitHub上实时更新. VS Code 本来是前端人员专用,但由于它实在是太好用了,于是,各种开发方向的码农也正在用 VS Code 作为他们的主力编程工具.甚至是一些写作的同 ...
- virtualbbox centos7 NAT模式外网 Host-only Adapter模式联网 双网卡
1.下载oracle VM virtualbox centos7 1.1. 下载地址:https://www.virtualbox.org/wiki/Downloads https://www.ce ...
- 机器学习之EM算法(五)
摘要 EM算法全称为Expectation Maximization Algorithm,既最大期望算法.它是一种迭代的算法,用于含有隐变量的概率参数模型的最大似然估计和极大后验概率估计.EM算法经常 ...
- mac上Docker安装&初体验
Docker是什么? Docker是一个虚拟环境容器,可以将你的开发环境.代码.配置文件等一并打包到这个容器中,并发布和应用到任意平台中. 官方文档:https://docs.docker.com H ...
- SQL SERVER启动步骤
第一步 从注册表读取SQL SERVER启动信息 (1)Audit Level:设置SQL SERVER是否记录用户登陆信息 Login Mode:设置SQL SERVER登陆类型是只接受windo ...
- Scrapy(爬虫框架)中,Spider类中parse()方法的工作机制
parse(self,response):当请求url返回网页没有指定回调函数,默认的Request对象的回调函数,用来处理网页返回的response,和生成的Item或者Request对象 以下分析 ...
- 【PAT】B1008 数组元素循环右移问题
猥琐方法 直接分成两部分输出数组元素,注意空格的问题 #include<stdio.h> int arr[101]; void Priarr(int a,int b){ if(a<= ...
