umask不起作用

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

umask不起作用

#1

帖子 jiandan23 » 2019-04-23 17:39

我的目的:希望将某服务程序的输出文件的权限改为666(默认是664)。
运行步骤:在bash下面先运行“umask 0000”命令,然后启动服务service xxxxx start,结果发现该服务生成的文件权限还是664。
这个是什么原因?难道服务内部又改变了umask的值? :What
(服务程序是别人的,二进制格式,看不到内部细节。)
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: umask不起作用

#2

帖子 astolia » 2019-04-23 23:08

现在服务管理器一般都是systemd了吧,umask只对当前进程和子进程有效,用systemd启动的服务又不是bash的子进程,当然没影响。
看你那个程序的服务启动配置/脚本是什么。
如果是systemd的.service,那就在[Service]下面加一个UMask=xxx
如果还是传统的/etc/init.d/xxx,就直接在里面加umask xxx
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: umask不起作用

#3

帖子 jiandan23 » 2019-04-24 9:16

Hello,astolia:是传统的/etc/init.d/xxx,不过我再里面添加了umask 0000还是不起作用。我怀疑是daemon自己又调整了umask值,不知道有没有办法强制修改?
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: umask不起作用

#4

帖子 astolia » 2019-04-24 19:50

改没改你可以从/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也可以实现类似的功能,看你自己用哪个了
头像
jiandan23
帖子: 86
注册时间: 2010-12-17 22:31
系统: Mint 19.2

Re: umask不起作用

#5

帖子 jiandan23 » 2019-04-26 11:20

已打算用inotify解决这个问题,感谢!
回复