你可能不知道的linux文件权限管理
目录的 rwx 权限
当前用户:vagrant:vagrant
创建 testdir
目录,进入 testdir
目录内。创建文件 test
。
$ mkdir testdir $ cd testdir $ touch test
修改 testdir
权限为 000
,尝试执行 ls testdir
$ chmod 000 testdir $ ls testdir/ ls: cannot open directory testdir/: Permission denied
修改 testdir
权限为 400
,尝试执行 ls testdir
$ chmod 400 testdir ls -l testdir/ ls: cannot access testdir/test: Permission denied total 0 -????????? ? ? ? ? ? test
结果:能够读取目录下文件列表,但是看不到具体文件信息(权限、大小、用户组、时间等),尽管当前用户是 /testdir/test
的拥有者
且具有 rwx
权限。
拥有目录的 r
权限可以读取目录下的文件列表。
继续,尝试进入 testdir
目录。
$ cd testdir/ -bash: cd: testdir/: Permission denied
看来 r
权限并不能让我们具有进入目录。
我们增加一个 x
权限试试。
~$ chmod 500 testdir/ ~$ cd testdir/ ~/testdir$ ls -l total 0 -rw-rw-r-- 1 vagrant vagrant 0 Nov 19 08:16 test
成功进入。
拥有目录的 x
权限能够让我们进入到目录下。在此工作目录下,我们可以查看文件列表及文件的属性信息。
尝试删除 test
文件或者新建文件 test1
。
~/testdir$ rm test rm: cannot remove ‘test’: Permission denied ~/testdir$ touch test1 touch: cannot touch ‘test1’: Permission denied
拥有目录的 r x
权限并不能允许我们改变目录的内容。目录里的文件列表可以看做是目录的内容。
拥有目录的 w
权限可以对目录的内容进行增删。
~/testdir$ chmod 700 . ~/testdir$ rm test ~/testdir$ touch test1 ~/testdir$ ls -l total 0 -rw-rw-r-- 1 vagrant vagrant 0 Nov 19 08:30 test1
umask
在上面的例子里,我们创建的新文件的权限是 664
(-rw-rw-r--),为什么默认权限会是 664
,我如果想改变新文件的默认权限怎么办?
控制台输入 umask:
$ umask 0002
umask
是权限的补码。文件的默认权限是 666 - umask
。
如果我们创建的文件不想让其他用户有 r
权限,则修改补码为 0006
即可。
~/testdir$ umask 0006 ~/testdir$ touch test2 ~/testdir$ ls -l | grep test2 -rw-rw---- 1 vagrant vagrant 0 Nov 19 08:38 test2
为什么文件的默认权限不是 777 - umask
呢?因为新建的文件默认不具有可执行权限,所以只考虑 rw
权限的话,这波操作自然是 666
了。
目录默认具有 x
权限,当 umask
是 0002
时,创建的目录的默认权限应该是 777 - 0002 = 775
:
~/testdir$ mkdir dir1 ~/testdir$ ls -l | grep dir1 drwxrwxr-x 2 vagrant vagrant 4096 Nov 19 08:39 dir1
特殊权限
SUID
一般来说文件权限是 rwx
。我们查看一下 passwd
(修改密码命令)的权限:
~/testdir$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 47032 May 16 2017 /usr/bin/passwd
细心点你会发现它的用户权限的 x
位竟然是 s
。这个权限叫 SUID
,仅对二进制程序有效。
当用户具有该文件的执行权限时,执行该文件会短暂的获取该文件所有者权限的支持。
比如:所有用户的密码存在 /etc/shadow
这个文件里,且该文件的权限默认是 -r-------- root root
,仅root
用户具有强制写入权限,那为什么普通用户还能修改自己的密码呢?就是因为 passwd
命令具有 SUID
权限,用户执行该命令时会获得文件所有者 root
的权限支持,从而修改自己的密码。
SGID
当 group
的 x
位置变成 s
时,说明该文件具有 SGID
权限。SGID
权限对二进制程序有效。类似 SUID
,用户在具有文件的 x
权限时,执行该文件,会获取该文件所属用户组的权限支持。
除了二进制程序外,SGID
也可以设置在目录上。
若用户对该目录具有 SGID
权限:
用户在此目录下的有效用户组将会变成该目录的用户组。
如果用户具有该目录的 w
权限,则用户在此目录下创建的文件的用户组与此目录的用户组相同。
该权限对于项目开发很重要。
SBIT
该权限目前只对目录有效:
当用户对此目录具有 w,x
权限,用户在该目录下创建文件夹或目录后,仅自己和 root
才有权限删除该文件。
Others
的 x
权限位若为 t
,则说明文件夹具有 SBIT
权限。
比如 /tmp
目录:
$ ls -l / | grep tmp drwxrwxrwt 4 root root 4096 Nov 19 09:09 tmp $ sudo -s # touch test root@vagrant-ubuntu-trusty-64:/tmp# exit exit vagrant@vagrant-ubuntu-trusty-64:/tmp$ rm test rm: remove write-protected regular empty file ‘test’? y rm: cannot remove ‘test’: Operation not permitted
如何设置以上三种权限
如果在普通的权限设置的“三个数字”前再加一个数字,那前面这个数字就代表这几个权限了:
- 4 为 SUID
- 2 为 SGID
- 1 为 SBIT
比如:
# chmod 777 /tmp # ls -l / | grep tmp drwxrwxrwx 4 root root 4096 Nov 19 09:17 tmp # chmod 1777 /tmp # ls -l / | grep tmp drwxrwxrwt 4 root root 4096 Nov 19 09:17 tmp