linux下创建⽂件的⽂件权限问题
今天发现创建⽂件的权限和⾃⼰规定的权限不⼀致,了解到了权限掩码的问题,这⾥总结⼀下。
⾸先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它⽤户的权限),不过通常我们都只⽤到后⾯3个,第⼀个是特殊的权限位,暂时没有很了解。⽐如
chmod 0777 file 就代表给file设置属主、组内⽤户、其他⽤户分别是rwx、rwx、rwx的权限。
在我的ubuntu15.04下,umask默认是0002,可以⽤umask指令查看,加上参数-S会更加易懂:
掩码,顾名思义,是⽤来掩盖了⼀些bit,这些bit在这⾥就表⽰权限,⽐如从上⾯的图我们可以看到0002就是掩盖了其他⽤户的w权限(o=rx),因为2在⼆进制是010,我们创建
⽂件时候规定的⽂件权限***是要和掩码的反码按位相与的,这样才可以屏蔽掉某个位。⽐如创建⽂件的时候指定了0666,那么0666 & ~0002 = 0664,最终建⽴的⽂件权限为
rw-rw-r--。
另外,linux下(不包含权限掩码umask)规定了⽂件的默认权限是0666(去除了执⾏权限x可以减少⾮常多的攻击,因为很多病毒⽂件如果创建出来没有执⾏权限的话,就失去
了意义),⽬录的默认权限是0777。所以,我们如果新建⼀个⽂件,⽂件权限还要和权限掩码umask按位相与,即0666 & ~0002 = 0664(我的电脑上),最后得到的0664(rw-
rw-r--)才是⽂件的真正权限,同理,创建⼀个⽬录(0777 & ~0002 = 0775,即rwxrwxr-x)也⼀样:
我们可以⽤umask命令来改变权限掩码的值,相应的,我们创建的⽂件也会要和umask按位相与,会少相对应的部分权限:
相应的,c也有个umask函数,我们⽤c也可以查看和改变umask的值,但是,修改的仅仅是调⽤umask()这个函数的进程的值,也就是其余的umask值不变,我们可以⽤shell命令
umask查看⼀下,会发现umask还是原来的值,所以在c语⾔⾥⾯调⽤的umask只会改变调⽤进程的umask。查看man帮助⼿册可以知道,fork出来的⼦进程也会继承⽗进程的
umask,也就是说⽗进程如果修改了权限掩码为0001,那么fork得到的⼦进程将会和⽗进程保持⼀直的权限掩码0001⽽不是系统的0002或者0022。
当我们⽤c语⾔的open(linux的系统函数)来创建⼀个新⽂件的时候(即第⼆个参数指定O_CREAT),我们⼀定要指明第三个参数的权限是什么,默认的权限并不是linux默认
linux创建文件指令
的0666,所以不指定的话我也不知道是什么(感觉每次创建的都不⼀样?)。因此,保险起见,我们在⽤open创建⼀个⽂件的时候,就按照⾃⼰的需求(没有的话就按照linux
默认的0666)指定创建的⽂件权限,⽽制定了这个权限以后,还要和当前进程的权限掩码按位相与,这样才会得到最终的⽂件权限。
O_CREAT
If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file is created; the user ID of the file is set to the effective user ID of the process; the group ID of the file is set to  the group ID of the file's parent directory or to the effective group ID of the process;  and the access permission bits (see <sys/stat.h>) of the file mode are set to the value of the third argument taken as type mode_t modified as follows: a bitwise-AND is performed on the file-
mode bits and the corresponding bits in the complement of the process' file mode creation mask. Thus, all bits in the
file mode whose corresponding bit in the file mode creation mask is set are cleared. When bits other than the file permission bits are set, the effect is unspecified. The third argument does not affect whether the file is open for reading, writing or for both.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。