Camel中如何为toD("file:~")输出文件设置权限或保留原有所有者
问题原因
Tomcat进程本身以tomcat用户身份运行,Linux系统默认规则下,普通用户创建的文件所有者默认为进程运行用户,且普通用户没有权限直接将文件所有者修改为其他用户,所以才会出现输出文件所有者变为tomcat的情况。
可行方案
方案1:保留原文件所有者(需要额外提权)
如果必须保留原所有者userA,需要先给tomcat用户授予修改文件所有者的sudo免密权限:
- 编辑sudo配置文件
visudo,添加一行:tomcat ALL=(ALL) NOPASSWD: /usr/bin/chown - 在Camel路由中新增处理器,目标文件生成后读取原文件的所有者信息,执行
sudo chown userA:userA 目标文件路径命令修改所有者即可。
注意:该方案需要给Tomcat进程提权,存在一定安全风险,非必须场景不推荐使用。
方案2:配置用户组权限(更安全,无需提权,推荐使用)
不需要修改文件所有者,通过用户组权限控制即可满足userA对输出文件的读写需求,有两种实现方式:
- 直接通过Camel文件组件自带参数配置权限:在目标endpoint中添加
chmod、chmodDirectory参数,给用户组开放读写权限,示例配置:
同时将userA加入tomcat用户的所属组,或者将tomcat加入userA的所属组,即可实现userA对输出文件的读写。.toD("file:someotherlocation/?chmod=664&chmodDirectory=775") - 给目标目录设置setgid权限,自动继承目录所属组:
- 创建公共用户组
groupadd common_group - 将tomcat和userA都加入该组:
usermod -aG common_group tomcat && usermod -aG common_group userA - 修改目标目录的所属组和权限:
chgrp common_group someotherlocation/ && chmod 2775 someotherlocation/
配置完成后,该目录下所有新创建的文件会自动继承目录的common_group所属组,配合Camel的chmod参数给组开放读写权限即可,不需要修改任何路由代码。
- 创建公共用户组
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

