Linux 规定,一个文件的需要具备三种权限:文件所属主的权限,文件所属主所在组的权限,以及其他用户的权限。
从命令结果可以看到一连串的字符串-rw-r–r–这种字符分别代表着属主,属组,其他用户的权限,
第一个字符代表文件(-)、目录(d),链接(l)
其余字符每3个一组(rwx),读(r)、写(w)、执行(x)
第一组rwx:文件所有者的权限是读、写和执行
第二组rw-:与文件所有者同一组的用户的权限是读不能写和执行
第三组r–:不与文件所有者同组的其他用户的权限是读不能写和执行
文件默认权限与改变文件的属性与权限
Liunx系统下为了方便用户的创建操作,会对新文件设置一个默认的权限。比如,普通文件不会给执行权限(x),出于安全考虑,防止下载的不明文件(计算机病毒)自动执行;目录文件会给执行权限,方便用户进入查看,但不给写(w)权限,以免目录被乱改。 一个文件的属性与权限有很多,先介绍几个常用与用户组、所有者、各种身份的权限的修改的命令:
1).chgrp:change group,改变用户所属用户组;
2).chown:change owner,改变文件所有者;
3).chmod:change mode,改变权限;
1)).数字类型改变;
Linux文件的基本权限有9个,分别是owner,group,others三种身份各自的r、w、x权限。我们用数字来代表各个权限:r=4,w=2,x=1,各种身份各自的三个权限的分数累加,就可以得到一个代表文件权限的三位数,比如777,即该文件对属主、属组、其他用户都是开放r,w,x权限的。
2)).符号类型改变;
我们可以用u,g,o来分别代表三种身份权限,此外用a(all)代表全部的身份,读写执行的权限可以写成r、w、x,那么可以用以下例子表示:u=rwx,g=rx,ug=rx,a=rx等。
3.特殊权限w
系统中总会有一些事物无法用基本权限限定,有的是出于安全考虑做必要的隔离,比如其他用户对/user/bin/passwd的访问权限设置;或者是公共空间的自律要求,比如在/tmp这个系统存放临时文件的目录,某用户对其他用户创建的文件有何访问权限呢?特殊权限有SUID,SGID,SBIT:
1).SUID
当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简程SUID。SUID让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上,同样也不能放到目录上,放上也是无效的。
2).SGID
当s出现在文件的所属用户组x权限位置上时,就是SGID,和SUID一样,只是SGID是获得该程序所属用户组的权限。
这相SGID有几点需要我们注意:
1、SGID对二进制程序有用;
2、程序执行者对于该程序来说需具备x的权限;
3、SGID主要用在目录上;
理解了SUID,我想SGID也很容易理解。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。
3).SBIT:Sticky Bit
SBIT只针对目录有效,主要在/tmp目录应用,或者其他工作组的共享文件目录。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。
SUID/SGID/SBIT权限设置
和rwx权限一样,s、t也有两种设置方法:
1、文字法 :SUID: u+s ,SGID: g+s,SBIT: o+t
2、数字法:将原来的三位数扩展为四位数即可,SUID为4,SGID为2,SBIT为1,把它们放在权限数字的最开头。例如设置SUID,可以写成4777,设置SGID可以写成,2777
练习题1复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。
改变文件的权限需要使用chmod命令
语法
chmod(选项)(参数)
选项
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或–quiet或——silent:不显示错误信息;
-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose:显示指令执行过程;
–reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
参数
权限模式:指定文件的权限模式;
文件:要改变权限的文件
先复制文件到/home/tuser1下面
可以看到tuser下面的文件权限时属主有读写功能,属组和其他主只有读功能,相对于目录既是访问功能,这时候将权限设置为rw——-即可,这里所有文件都是一样的权限,使用-R选项
练习题2编辑/etc/group文件,添加组hadoop。
/etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用
户组的用户之间具有相似的特征。
/etc/group 的内容包括用户组(Group)、用户组口令、GID及该用户组所包含的用户(User),每个用户组一条记录;格式如下:
group_name:passwd:GID:user_list
在/etc/group 中的每条记录分四个字段:
第一字段:用户组名称;
第二字段:用户组密码;
第三字段:GID
第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
我们举个例子:
root:x:0:root,linuxsir 注:用户组root,x是密码段,表示没有设置密码,GID是0,root用户组下包括root、linuxsir以及GID为0的其它用户(可以通过/etc/passwd查看)
根据题意使用文本编辑来增加用户组,原本使用groupadd 添加用户也是在/etc/group上新增一行用户,现在使用vim的话直接在/etc/group最下面加一行文字就可以了,/etc/group的权限只有属主root才能编辑,注意切换用户
练习题3手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop
与上题大致相同,按照/etc/passwd中的信息格式进行添加,我之前使用过了hadoop这里新建一个hadoop1
linuxsir:x:501:502::/home/linuxsir:/bin/bash
第一字段:用户名(也被称为登录名);
第二字段:口令;在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow 文件中;
第三字段:UID ;
第四字段:GID;
第五字段:用户名全称,这是可选的,可以不设置,在beinan这个用户中,用户的全称是beinan sun ;而linuxsir 这个用户是没有设置全称;
第六字段:用户的家目录所在位置;beinan 这个用户是/home/beinan ,而linuxsir 这个用户是/home/linuxsir ;
第七字段:用户所用SHELL 的类型,beinan和linuxsir 都用的是 bash ;所以设置为/bin/bash ;
练习题4复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。
这题跟第一题没什么区别,所以修改权限时使用的参数是参考/home/tuser1的权限
练习题5修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。
语法
chown(选项)(参数)
选项
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或–quite或——silent:不显示错误信息;
-h或–no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v或——version:显示指令执行过程;
–dereference:效果和“-h”参数相同;
–help:在线帮助;
–reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
–version:显示版本信息。
参数
用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件:指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符。
练习题6 显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式
/proc/meminfo 是个文本文件,找到以s或者S开头的行需要用文本处理工具grep
第一种方法使用正则匹配行首锚定使用^ 然后s开头或者S的话是s|S,所以
第二种方法使用-i忽视大小写
练习题7显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户
grep 中的-v选项取/sbin/nologin的反补,正则匹配行尾为/sbin/nologin的字符串
练习题8显示/etc/passwd文件中其默认shell为/bin/bash的用户
与上题大致相同
练习题9找出/etc/passwd文件中的一位数或两位数;
etc/passwd文件中以:为分隔符,匹配一位数或者两位数用{m,n}标示至少出现m次,最多出现n次
练习题10显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
我这边没有这个文件,自己随便写了个。用^锚定行首
练习题11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行
这个行尾锚定要跟在[]里面,不然就是前面一大片字符串了,
练习题12打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行
行尾匹配前面所有字符添加*
练习题13添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
这里涉及一个向后引用
后向引用:引用前面的分组括号中的模式所匹配到的字符
分组括号中的模式匹配到的内容或被正则表达式引擎自动记录于内部的变量中:
\1:模式从左侧起,第一个左括号及与之匹配的右括号之间模式匹配到的内容
\2:模式从左侧起,第二个左括号及与之匹配的右括号之间模式匹配到的内容…
首先匹配出来前面的用户id,用户名在/etc/passwd中是一个完整的单词,之间有:隔开所以使用[[:alpha:]]+>来表示用户名ID,由于在行首,所以使用^来锚定用户名字再使用括号来限定整个字符串即^([[:alpha:]]+>),后面紧接着大量的字符串使用.*进行表示。但有限制条件shell在最后的位置跟Uid相同使用分组括号\1匹配第一个括号的内容