我的目的:希望将某服务程序的输出文件的权限改为666(默认是664)。
运行步骤:在bash下面先运行“umask 0000”命令,然后启动服务service xxxxx start,结果发现该服务生成的文件权限还是664。
这个是什么原因?难道服务内部又改变了umask的值?
(服务程序是别人的,二进制格式,看不到内部细节。)
umask不起作用
- astolia
- 论坛版主
- 帖子: 6452
- 注册时间: 2008-09-18 13:11
Re: umask不起作用
现在服务管理器一般都是systemd了吧,umask只对当前进程和子进程有效,用systemd启动的服务又不是bash的子进程,当然没影响。
看你那个程序的服务启动配置/脚本是什么。
如果是systemd的.service,那就在[Service]下面加一个UMask=xxx
如果还是传统的/etc/init.d/xxx,就直接在里面加umask xxx
看你那个程序的服务启动配置/脚本是什么。
如果是systemd的.service,那就在[Service]下面加一个UMask=xxx
如果还是传统的/etc/init.d/xxx,就直接在里面加umask xxx
- jiandan23
- 帖子: 86
- 注册时间: 2010-12-17 22:31
- 系统: Mint 19.2
Re: umask不起作用
Hello,astolia:是传统的/etc/init.d/xxx,不过我再里面添加了umask 0000还是不起作用。我怀疑是daemon自己又调整了umask值,不知道有没有办法强制修改?
- astolia
- 论坛版主
- 帖子: 6452
- 注册时间: 2008-09-18 13:11
Re: umask不起作用
改没改你可以从/proc/xxx/status里面看服务进程实际的Umask值。
另外umask并不是来决定文件权限是什么,而是来决定文件权限中不能有什么。实际的文件权限计算公式为(mode & ~umask),其中mode是程序调用creat/open/openat时传入的参数。改成0000时还没用,不一定是程序自己改了umask,更可能是程序传入的参数就是664。
如果你懂汇编的话,可以尝试修改可执行程序,将传入的参数改成666。
如果对linux库函数足够了解,也可以利用LD_PRELOAD的技巧来覆盖掉服务进程调用的标准库函数
否则只能在它创建了文件之后,再去改成666。这个可以利用内核的inotify机制。
1、安装inoticoming:sudo apt install inoticoming
2、假如创建的文件是在/tmp/a目录下面,那么就运行 inoticoming /tmp/a chmod 0666 /tmp/a/{} \;
这样凡是在/tmp/a下面新建的文件权限都会被chmod设置为666
源里的其他一些工具,比如inotify-hookable也可以实现类似的功能,看你自己用哪个了
另外umask并不是来决定文件权限是什么,而是来决定文件权限中不能有什么。实际的文件权限计算公式为(mode & ~umask),其中mode是程序调用creat/open/openat时传入的参数。改成0000时还没用,不一定是程序自己改了umask,更可能是程序传入的参数就是664。
如果你懂汇编的话,可以尝试修改可执行程序,将传入的参数改成666。
如果对linux库函数足够了解,也可以利用LD_PRELOAD的技巧来覆盖掉服务进程调用的标准库函数
否则只能在它创建了文件之后,再去改成666。这个可以利用内核的inotify机制。
1、安装inoticoming:sudo apt install inoticoming
2、假如创建的文件是在/tmp/a目录下面,那么就运行 inoticoming /tmp/a chmod 0666 /tmp/a/{} \;
这样凡是在/tmp/a下面新建的文件权限都会被chmod设置为666
源里的其他一些工具,比如inotify-hookable也可以实现类似的功能,看你自己用哪个了
- jiandan23
- 帖子: 86
- 注册时间: 2010-12-17 22:31
- 系统: Mint 19.2
Re: umask不起作用
已打算用inotify解决这个问题,感谢!