1.文件权限概述
2.权限位说明
linux文件或目录的权限位是由9个权限位来控制的,每三位一组,它们分别是文件属主(Owner)的读、写、执行,用户组(Group)的读、写、执行以及其他用户(Other)的读、写、执行。
r read 可读权限 对应数字4
w write 可写权限 对应数字2
x (Execute,执行权限)对应数字1
`-` (没有任何权限) 对应数字0
3.实战案例
3.1 演示环境
用户环境准备
[root@linzhongniao ~]# groupadd nishishei 一个家庭
[root@linzhongniao ~]# useradd linzhongniao -g nishishei 主人
[root@linzhongniao ~]# useradd lisi -g nishishei
useradd: user 'lisi' already exists
如果提示创建的用户已经存在可以用usermod修改用户所在用户组
[root@linzhongniao ~]# usermod lisi -g nishishei 家庭成员
[root@linzhongniao ~]# useradd test 外面的人
[root@linzhongniao ~]# id linzhongniao
uid=509(linzhongniao) gid=509(nishishei) groups=509(nishishei)
[root@linzhongniao ~]# id lisi
uid=504(lisi) gid=509(nishishei) groups=509(nishishei)
[root@linzhongniao ~]# id test
uid=510(test) gid=510(test) groups=510(test)
文件测试准备
[root@linzhongniao ~]# mkdir /linzhongniao -p
[root@linzhongniao ~]# echo "echo linux">/linzhongniao/test.sh
[root@linzhongniao ~]# chmod +x /linzhongniao/test.sh
[root@linzhongniao ~]# cat /linzhongniao/test.sh
echo linux
[root@linzhongniao ~]# ls -l /linzhongniao/test.sh
-rwxr-xr-x. 1 root root 11 Jul 26 23:05 /linzhongniao/test.sh
3.2修改文件的属主和所属组
修改文件的属主和所属组用chown命令
格式chown 用户.(或者:)用户组 文件/目录
[root@linzhongniao ~]# chown linzhongniao.nishishei /linzhongniao/test.sh
[root@linzhongniao ~]# ls -l /linzhongniao/test.sh
-rwxr-xr-x. 1 linzhongniao nishishei 11 Jul 26 23:05 /linzhongniao/test.sh
linzhongniao用户和nishishei用户组的成员拥有对应属主的权限,即读,写和执行的权限。
登录lisi用户可以查看和执行test.sh,因为lisi属于nishishei用户组,属于这个组的只有读和执行的权限,没有删除和修改的权限。
4.普通文件权限及结论总结
(1)可读r:表示具有读取、阅读文件内容的权限。
(2)可写w:表示具有新增、修改删除文件(删除必须有执行权限)内容的权限,如果没有r的配合,那么vi编辑文件会提示无法编辑(但可强制编辑,echo 可以重定向或追加)。
总结:有读和写(r和w)的权限配合,可以用vi编辑文件,不配合也能vi编辑,保存要强制保存。
有写和执行(w和x)权限的配合,可以删除文件。
(3)特别提示:删除文件(修改文件名)的权限是受父目录的权限控制的,和文件本身权限无关。如果想删除文件应该给上一级目录的用户或者用户组可写和执行的权限权限。
[linzhongniao@linzhongniao ~]$ ls -ld /linzhongniao/test.sh
-rwxr-xr-x. 1 linzhongniao nishishei 13 Jul 27 19:25 /linzhongniao/test.sh
[linzhongniao@linzhongniao ~]$ ls -ld /linzhongniao/
drwxr-xr-x. 2 root root 4096 Jul 27 19:25 /linzhongniao/
[linzhongniao@linzhongniao ~]$ rm -rf /linzhongniao/test.sh
rm: cannot remove `/linzhongniao/test.sh': Permission denied
permitted
没有权限删除,所以要给文件上一级所在目录的其他用户添加可写权限
[root@linzhongniao ~]# chmod o+w /linzhongniao/
[root@linzhongniao ~]# ls -ld /linzhongniao/
drwxr-xrwx. 2 root root 4096 Jul 27 19:25 /linzhongniao/
[linzhongniao@linzhongniao ~]$ ls -ld /linzhongniao/
drwxr-xrwx. 2 root root 4096 Jul 27 19:25 /linzhongniao/
[linzhongniao@linzhongniao ~]$ rm -rf /linzhongniao/test.sh
(4)root只要有x的权限就能执行。
5.目录的权限及总结
5.1可读r
可读的权限,需要和x执行权限配合使用才能查看目录或文件的内容
(1)如果没有x权限不能进到目录里,即无法cd dir
(2)如果没有x权限,ls查看列表时是可以看到所有的文件名,但是会提示无权限访问目录下文件。
(3)如果ls –l 查看列表时所有属性会带有问号,也会提示无法访问目录下的文件,但是可以看到文件名。
[root@linzhongniao ~]# touch /linzhongniao/test/tmp.txt
[root@linzhongniao ~]# ls -ld /linzhongniao/test/
drwxrwxr-x. 2 root root 4096 Jul 27 20:16 /linzhongniao/test/
举例:可读权限r和执行权限x的使用
将其他用户只给可读权限
[root@linzhongniao ~]# chmod o=r /linzhongniao/test/
[root@linzhongniao ~]# ls -ld /linzhongniao/test/
drwxrwxr--. 2 root root 4096 Jul 27 20:16 /linzhongniao/test/
切换到test用户测试,如下所示是不能查看和进入到目录里面去的
[test@linzhongniao ~]$ ls -ld /linzhongniao/test/tmp.txt
ls: cannot access /linzhongniao/test/tmp.txt: Permission denied
[test@linzhongniao ~]$ cd /linzhongniao/test/
-bash: cd: /linzhongniao/test/: Permission denied
[test@linzhongniao ~]$ ls /linzhongniao/test/
ls: cannot access /linzhongniao/test/tmp.txt: Permission denied
tmp.txt
给上级目录的其他用户可执行权限,就可以查看文件内容了
[root@linzhongniao ~]# chmod o=rx /linzhongniao/test/
[root@linzhongniao ~]# ls -ld /linzhongniao/test/
drwxrwxr-x. 2 root root 4096 Jul 27 20:20 /linzhongniao/test/
[test@linzhongniao ~]$ ls /linzhongniao/test/
tmp.txt
[test@linzhongniao ~]$ cd /linzhongniao/test/
[test@linzhongniao test]$ pwd
/linzhongniao/test
[test@linzhongniao test]$ whoami
test
5.2可写w
w表示具有创建、增加、删除或修改目录内文件内容的权限(需要x权限配合)。
[root@linzhongniao ~]# chmod o=x /linzhongniao/test/
[root@linzhongniao ~]# ls -ld /linzhongniao/test/
drwxrwx--x. 2 root root 4096 Jul 27 20:20 /linzhongniao/test/
[test@linzhongniao test]$ touch ddd.txt
touch: cannot touch `ddd.txt': Permission denied
[test@linzhongniao test]$ ls
ls: cannot open directory .: Permission denied
5.3可执行x权限
表示具有进入目录和执行的权限,例如:cd dir。但是没有读取r权限无法显示列表文件和目录,以及不能进入到目录中。没有可写权限不能删除修改编辑文件内容。有执行脚本的权限。
[root@linzhongniao ~]# chmod o=x /linzhongniao/test/
[root@linzhongniao ~]# ls -ld /linzhongniao/test/
drwxrwx--x. 2 root root 4096 Jul 27 20:20 /linzhongniao/test/
[test@linzhongniao ~]$ cd /linzhongniao/test/
提示:可读权限r和可写权限w都要和执行x权限配合才能够查看和编辑修改目录或文件的内容。
6.改变权限属性命令chmod
chmod - change file mode bits
[root@linzhongniao ~]# which chmod
/bin/chmod
chmod是用来改变文件或目录权限的命令,但只有文件的属主和超级用户才有这种权限,通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达式的方法来设置权限,另外一种是使用数字的方法来设置权限,数字方法是比较常用的。
如果我们想改变的仅仅是第一个打开的目录的权限时,使用chmod命令时不用加任何参数,如果想把目录下的所有文件或子目录也同时改变,需要使用 –R参数。
6.1 chmod数字权限表示法
[root@linzhongniao ~]# chmod 755 /linzhongniao/test/
[root@linzhongniao ~]# ls -ld /linzhongniao/test/
drwxr-xr-x. 2 root root 4096 Jul 27 20:20 /linzhongniao/test/
6.2 chmod字符式权限表示法
chmod 用户类型 [+|-|=] 权限字符 文件名
用表格表示如下
演示:
[root@linzhongniao ~]# ls -ld test.sh
-rw-r--r--. 1 root root 25 Jul 27 21:52 test.sh
属主给执行权限
[root@linzhongniao ~]# chmod u+x test.sh
[root@linzhongniao ~]# ls -ld test.sh
-rwxr--r--. 1 root root 25 Jul 27 21:52 test.sh
属组给执行权限
[root@linzhongniao ~]# chmod g+x test.sh
[root@linzhongniao ~]# ls -ld test.sh
-rwxr-xr--. 1 root root 25 Jul 27 21:52 test.sh
属主取消可读权限,属组和其他用户给执行权限,中间可以用“,”逗号分隔
[root@linzhongniao ~]# chmod u-r,g+x,o+x test.sh
[root@linzhongniao ~]# ls -ld test.sh
--wxr-xr-x. 1 root root 25 Jul 27 21:52 test.sh
[root@linzhongniao ~]# chmod ugo=r test.sh
[root@linzhongniao ~]# ls -ld test.sh
-r--r--r--. 1 root root 25 Jul 27 21:52 test.sh
[root@linzhongniao ~]# chmod a=xr test.sh
[root@linzhongniao ~]# ls -ld test.sh
-r-xr-xr-x. 1 root root 25 Jul 27 21:52 test.sh
6.3 默认权限分配的命令umask(了解即可)
为什么linux的默认目录权限是755,而文件的默认权限是644呢?
这些都是由umask值来控制的,它在创建文件的时候由一段脚本来控制做判断。
[root@linzhongniao ~]# umask
0022
[root@linzhongniao ~]# sed -n '65,69p' /etc/bashrc
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
6.3.1 根据umask值来计算文件权限的方法
(1)简单好用的加减法计算(并非是数学里面的加减法运算)
用666减去umask设置的035等于631,凡是得到的数的个位为奇数位,个位加1;同理目录的权限计算方法也是一样的用777减去umask值。
[root@linzhongniao ~]# umask 035
[root@linzhongniao ~]# touch fff
[root@linzhongniao ~]# ll fff
-rw-r---w-. 1 root root 0 Jul 27 22:34 fff
umask设置的值都为偶数直接相减
[root@linzhongniao ~]# umask 044
[root@linzhongniao ~]# touch hhh
[root@linzhongniao ~]# ll hhh
-rw--w--w-. 1 root root 0 Jul 27 22:37 hhh
(2)永久修改umask值(了解)
[root@linzhongniao ~]# sed -n '65,69p' /etc/bashrc
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
6.4 setuid和setqid粘滞位
linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限。粘滞位像tmp目录一样,是整个系统临时文件的的存放地,一个目录即使它的所有权限都开放rwxrwxrw,如果设置了粘滞位,除非目录的属主和root用户有权删除它除此之外的用户不能删除。可以工作但是不能删除。
suid s(有x) S(没有x) 4 用户对应的权限位(用户对应的3位上)
sgid s(有x) S(没有x)2 用户组对应的权限位(用户组对应的3位上)
sticky t(有x) T(没有x) 1 其他用户对应的权限位(其他用户对应的3位上)
例如:
[root@linzhongniao ~]# find /usr/bin -type f -perm 4755 -exec ls -l {} \;
-rwsr-xr-x. 1 root root 22544 Mar 17 2015 /usr/bin/pkexec
-rwsr-xr-x. 1 root root 2438408 Jun 19 23:16 /usr/bin/Xorg
-rwsr-xr-x. 1 root root 54464 Mar 22 2017 /usr/bin/at
-rwsr-xr-x. 1 root root 30768 Nov 24 2015 /usr/bin/passwd
-rwsr-xr-x. 1 root root 70480 May 11 2016 /usr/bin/chage
-rwsr-xr-x. 1 root root 75640 May 11 2016 /usr/bin/gpasswd
-rwsr-xr-x. 1 root root 40240 May 11 2016 /usr/bin/newgrp
-rwsr-xr-x. 1 root root 51784 Aug 24 2016 /usr/bin/crontab
6.4.1 suid知识小结
suid是针对命令和二进制程序的
(1)用户或属主对应的前三位权限的x位上如果有s就表示suid权限。当x位上没有小写x执行权限的时候,suid的权限显示的就是大S。
(2)suid作用是让普通用户可以以root(或其他)的用户角色运行,只有root(或其他)账号才能运行的程序或命令以及程序命令对应本来没有权限操作的文件等(注意和su及sudo的区别)。suid是为某一个命令设置特殊权限(使用者为所有人)。
(3)问题:希望linzhongniao用户能够删除本来无权删除的文件。
解答:给rm命令的属主设置suid权限
[root@linzhongniao ~]# ls -ld /linzhongniao/
drwxr-xrwx. 3 root root 4096 Jul 27 20:16 /linzhongniao/
[root@linzhongniao ~]# chmod 755 /linzhongniao/
设置权限位755,其他用户没有删除的权限
[root@linzhongniao ~]# ls -ld /linzhongniao/
drwxr-xr-x. 3 root root 4096 Jul 27 20:16 /linzhongniao/
切换到linzhongniao用户,删除/linzhongniao/test/下面的文件,会提示没有权限
[linzhongniao@linzhongniao test]$ whoami
linzhongniao
[linzhongniao@linzhongniao test]$ ls
ddddd tmp.txt
[linzhongniao@linzhongniao test]$ rm -f tmp.txt
rm: cannot remove `tmp.txt': Permission denied
给rm命令设置suid权限,看linzhongniao用户能不能删除
[root@linzhongniao ~]# ls -l `which rm|tail -1`
-rwxr-xr-x. 1 root root 57440 Jun 19 23:15 /bin/rm
[root@linzhongniao ~]# chmod u+s /bin/rm
[root@linzhongniao ~]# ls -l `which rm|tail -1`
-rwsr-xr-x. 1 root root 57440 Jun 19 23:15 /bin/rm
切换到linzhongniao用户,再删除文件就可以删除了
[linzhongniao@linzhongniao test]$ whoami
linzhongniao
[linzhongniao@linzhongniao test]$ pwd
/linzhongniao/test
[linzhongniao@linzhongniao test]$ rm -f tmp.txt
(4)suid修改的是执行的命令passwd,而不是处理的目标文件/etc/shadow
[root@linzhongniao test]# touch test.sh
[root@linzhongniao test]# chmod u+s test.sh
[root@linzhongniao test]# ls -l test.sh
-rwSr--r--. 1 root root 0 Jul 28 09:25 test.sh
(5)仅对二进制命令程序有效不能用在shell等类似脚本文件上(因为shell脚本仅仅是调用二进制命令程序而已,因此具体权限还需要看二进制命令本身)。
(6)二进制命令程序需要有可执行权限x配合。
(7)suid权限只在程序命令执行过程中有效。
(8)执行suid命令的任意系统用户都可以获得该命令程序在执行期间对应的拥有者的所有权限。
(9)suid是一把双刃剑,是一个比较危险的功能,对系统安全有一定的威胁。系统suid的无用的功能取消suid权利(安全优化)。
6.4.2 sgid知识小结
sgid是针对用户组的权限位
对于文件来说,sgid的功能如下:
(1)与suid不同的是,sgid既可以针对文件也可以针对目录设置。
(2)二进制命令或程序需要有可执行权限x。
(3)执行命令的任意用户可以获得该命令程序执行期间所属组的权限。
对于目录来说,sgid的功能如下:
(1)linux里默认情况所有用户创建文件,默认用户和组都是自身。
[linzhongniao@linzhongniao ~]$ touch sss
[linzhongniao@linzhongniao ~]$ ls -l sss
-rw-r--r--. 1 linzhongniao nishishei 0 Jul 28 11:02 sss
(2)可以为目录设置sgid,让超级用户root创建属于目录属主或者属组的文件。
6.4.3 sgid基于locate命令文件的案例
让用户没有使用locate查找命令路径的权限
[root@linzhongniao ~]# ls -l `which locate`
-rwx--s--x. 1 root slocate 38464 Mar 12 2015 /usr/bin/locate
[root@linzhongniao ~]# chmod g-s `which locate`
[root@linzhongniao ~]# ls -l `which locate`
-rwx--x--x. 1 root slocate 38464 Mar 12 2015 /usr/bin/locate
[root@linzhongniao ~]# su - linzhongniao
[linzhongniao@linzhongniao ~]$ locate cat
locate: can not stat () `/var/lib/mlocate/mlocate.db': Permission denied
6.4.4 setgid基于目录的案例
RHCE认证考试题创建共享目录
创建共享目录/home/admins:属组为adminuser,adminuser组成员对目录有写入读写和执行的权限,其他所有用户没有任何权限(root除外);在/home/admins目录中创建文件会自动继承adminuser组,文件只有属主可以删除。
[root@linzhongniao ~]# mkdir -p /home/admins
[root@linzhongniao ~]# groupadd adminuser
[root@linzhongniao ~]# ls -ld /home/admins
drwxr-xr-x. 2 root root 4096 Jul 28 11:19 /home/admins
[root@linzhongniao ~]# chown .adminuser /home/admins
[root@linzhongniao ~]# ls -ld /home/admins
drwxr-xr-x. 2 root adminuser 4096 Jul 28 11:19 /home/admins
[root@linzhongniao ~]# touch /home/admins/test
虽然是在/home/admins/下创建的,但是root用户创建的相当于root自己的孩子属主和属组还是root;需要设置setgid,让root创建属于别的组的孩子。
[root@linzhongniao ~]# chmod g+s /home/admins/
[root@linzhongniao ~]# touch /home/admins/linzhongniao.txt
[root@linzhongniao ~]# ll /home/admins/linzhongniao.txt
-rw-r--r--. 1 root adminuser 0 Jul 28 11:24 /home/admins/linzhongniao.txt
7.改变文件所属关系命令chown
chown(change owner)
当我们要改变一个文件的属主或者属组,我们所使用的用户必须是该文件的属主而且同时是目标属组的成员,或超级用户。只有超级用户才能改变文件的属主。
chown语法:
chown [选项]…[所有者](:或.)[组] 文件
如果想把目录下的所有内容修改属主和属组加-R参数。
改变属组也可以用chgrp命令,推荐使用chown
[root@linzhongniao ~]# chgrp kkk text.txt
[root@linzhongniao ~]# ls -l text.txt
-rw-r--r--. 1 root kkk 10 Aug 6 11:01 text.txt
8.改变文件属性chattr
chattr改变文件属性,lsattr显示设置的文件属性
(1) i参数锁定目录或文件,+i锁定目录,-i取消锁定
锁定passwd文件,锁定之后就不能创建用户了
[root@linzhongniao ~]# chattr +i /etc/passwd
[root@linzhongniao ~]# lsattr /etc/passwd
----i--------e- /etc/passwd
[root@linzhongniao ~]# useradd dddd
useradd: cannot open /etc/passwd
[root@linzhongniao ~]# chattr -i /etc/passwd
[root@linzhongniao ~]# useradd dddd
[root@linzhongniao ~]# id dddd
uid=511(dddd) gid=512(dddd) groups=512(dddd)
(2)a参数只能追加不能删除
只能向文件中追加内容,不能删除和编辑。注意:尽管是root用户也只能追加,不能删除。
[root@linzhongniao ~]# chattr +a text.txt
[root@linzhongniao ~]# lsattr text.txt
-----a-------e- text.txt
[root@linzhongniao ~]# rm -f text.txt
rm: cannot remove `text.txt': Operation not permitted
[root@linzhongniao ~]# >text.txt
-bash: text.txt: Operation not permitted
[root@linzhongniao ~]# echo "111">>text.txt
[root@linzhongniao ~]# cat text.txt
ssdsd
111
转载于:https://blog.51cto.com/10642812/2277017