【出錯記錄】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/目錄下的文件主或組的權限問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM