一、Linux 文件权限
Linux 里面一切皆文件,一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件。
1. 文件权限位说明
# mkdir /etc/dbfile
# chmod 754 /etc/dbfile
# ll -d /etc/dbfile
drwxr-xr-- 2 root root 6 Mar 3 16:08 /etc/dbfile
通过dbfile文件,我们分析各个字段所代表的含义
文件的权限描述共10个字符
- 第一个字符有三个值,用以表示文件类型, (-)表示文件, (d)表示目录, (l)表示链接
- 剩余9个字符每3个一组(rwx), r表示拥有读取权限, w表示拥有写权限, x表示拥有执行权限
- 第一组rwx: 表示文件的所有者的权限是可读,可写,可执行
- 第二组r-x: 表示与文件所有者同一个用户组的用户的权限是可读,不可写,可执行
- 第三组r-x-: 表示与文件所有者不同用户组的用户的权限是只有读权限
- 用数字表示的时候,可以简单的用r=4, w=2, x= 1, 表示 rwx= 4+2+1 =7
- 接下来的 2 表示连接的文件数
- root 表示文件的所属用户
- root 表示用户所在的用户组
- 6表示文件的大小
- Mar 3 16:08 表示文件的最后修改时间
- /etc/dbfile 表示文件名
对于目录来讲,拥有r权限,就可以使用ls命令获取其下的所有文件列表,拥有w可修改此目录下的文件列表,即创建或删除文件,拥有x权限,就可以cd至此目录当中,并且可以使用ls -l 来获取所有文件的详细属性信息。
对于文件而言,拥有r权限,可以打开文件,拥有w权限,可以修改文件内容,拥有x权限,是可以将此文件运行为进程,就是对于程序文件,有了相应的执行权限。
权限组合机制
--- 表示无读写执行权限 数字表示法为 0
--x 表示只有执行权限 1
-w- 表示只有写权限 2
-wx 表示只有写和执行权限 3
r-- 表示只有读权限 4
r-x 表示只有读权限和执行权限 5
rw- 表示只有读和写权限 6
rwx 表示读写执行权限都有 7
用例:
将下列文件权限用数字表示法写出来
rw-rw-r-- ,rwxrwxr-x ,rwxr-x--- ,rwxr-xr-x
664 775 750 755
二、权限管理类命令
1、chmod 控制用户对文件的权限的命令,命令使用方式有如下三种方式
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
首先我们先讲解第一种命令使用方式 chmod [OPTION]... MODE[,MODE]... FILE...
MODE参数说明,mode : 权限设定字串,多个MODE格式可以使用逗号进行分割,格式如下 :
[ugoa...][[+-=][rwxX]...][,...]
其中:
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。u= , g= , o=
- + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
用例:
(1)修改music目录下的daolang文件的属组权限为读写
# mkdir /tmp/music
# touch /tmp/music/{daolang,liudehua,bingyu,qinghuaci,qianzhihe,meirenyu}
# ll /tmp/music
# chmod g=rw /tmp/music/daolang
# ll /tmp/music/daolang
-rw-rw-r-- 1 root root 0 Mar 4 10:14 /tmp/music/daolang
(2)修改daolang文件的属主和属组的权限都是读写权限
# chmod ug=rw daolang
# ll ./daolang
-rw-rw-r-- 1 root root 0 Mar 4 10:14 ./daolang
(3)修改meirenyu文件的属主为读写执行,属组为读写,其它人无权限
# ll meirenyu
-rw-r--r-- 1 root root 0 Mar 4 10:14 meirenyu
# chmod u=rwx,g=rw,o= meirenyu
# ll meirenyu
-rwxrw---- 1 root root 0 Mar 4 10:14 meirenyu
(4)去除meirenyu文件的属主的执行权限
# chmod u-x meirenyu
# ll meirenyu
-rw-rw---- 1 root root 0 Mar 4 10:14 meirenyu
(5)对于meirenyu文件,增加其它用户对它的读权限
# chmod o+r meirenyu
# ll meirenyu
-rw-rw-r-- 1 root root 0 Mar 4 10:14 meirenyu
(6)对于bingyu文件,增加所有者和属组用户对它的执行权限
# ll bingyu
-rw-r--r-- 1 root root 0 Mar 4 10:14 bingyu
# chmod ug+x bingyu
# ll bingyu
-rwxr-xr-- 1 root root 0 Mar 4 10:14 bingyu
(7)对于bingyu文件,消除属组用户的写和执行权限
# chmod 777 bingyu
# ll bingyu
-rwxrwxrwx 1 root root 0 Mar 4 10:14 bingyu
# chmod g-wx bingyu
# ll bingyu
-rwxr--rwx 1 root root 0 Mar 4 10:14 bingyu
(8)对于bingyu文件,首先让所有用户只有读权限,然后让所有用户都有写权限
# chmod a=r bingyu
# ll bingyu
-r--r--r-- 1 root root 0 Mar 4 10:14 bingyu
# chmod a+w bingyu
# ll bingyu
-rw-rw-rw- 1 root root 0 Mar 4 10:14 bingyu
(9)对于bingyu文件,首先让所有者拥有执行权限,属组消除写权限
# chmod u+x,g-w bingyu
# ll bingyu
-rwxr--r-- 1 root root 0 Mar 4 10:14 bingyu
其次我们讲解第二种命令使用方式 chmod [OPTION]... OCTAL-MODE FILE...,八进制赋权方式
用例:
(1)对于bingyu文件,让其文件权限变为775,也就是所有者,可以读写执行,属组可以读写执行,其他人只能读和执行
# chmod 775 bingyu
# ll bingyu
-rwxrwxr-x 1 root root 0 Mar 4 10:14 bingyu
最后我们讲解第三种chmod的使用方式 chmod [OPTION]... --reference=RFILE FILE...,就是参考B文件的属性权限,让A也拥有此类权限。
用例:
(1)将/tmp/music/qinghuaci文件的权限设置为与 root用户目录下anaconda-ks.cfg文件权限一致,其权限为600
## ll anaconda-ks.cfg
-rw-------. 1 root root 1251 Dec 16 2019 anaconda-ks.cfg
# ll /tmp/music/qinghuaci
-rw-r--r-- 1 root root 0 Mar 4 10:14 /tmp/music/qinghuaci
# chmod --reference=./anaconda-ks.cfg /tmp/music/qinghuaci
# ll /tmp/music/qinghuaci
-rw------- 1 root root 0 Mar 4 10:14 /tmp/music/qinghuaci
chmod的选项有-R,作用是如果目标文件是一个目录时,递归地修改目录及目录下文件的权限,此选项,有可能导致目录下文件具有了执行权限,因此不建议使用,除非目录为空,和rm -rf 这样的删除命令有相同的危险性
用例
(1)首先将/etc/skel/目录拷贝到tmp目录下,确认目录skel的权限,再查看skel目录下文件的权限
# cp -r /etc/skel/ /tmp
# ll /tmp
total 4
-rw-r--r-- 1 root root 85 Mar 4 10:11 a.txt
drwx------. 2 mapleleaf mapleleaf 62 Feb 24 15:36 mapleleaf
drwxr-xr-x 2 root root 101 Mar 4 10:14 music
drwxr-xr-x. 2 root root 19 Feb 24 16:13 pear
drwxr-xr-x 2 root root 62 Mar 4 14:02 skel
# ll -a /tmp/skel/
//可以看到目录下文件的所有者不具备执行权限
total 12
drwxr-xr-x 2 root root 62 Mar 4 14:02 .
drwxrwxrwt. 11 root root 160 Mar 4 14:02 ..
-rw-r--r-- 1 root root 18 Mar 4 14:02 .bash_logout
-rw-r--r-- 1 root root 193 Mar 4 14:02 .bash_profile
-rw-r--r-- 1 root root 231 Mar 4 14:02 .bashrc
# chmod -R 700 /tmp/skel/
//将skel目录及目录下文件的权限设置为700
# ll -a /tmp/skel/
//目录下的文件的所有者具备了执行权限,比较危险
total 12
drwx------ 2 root root 62 Mar 4 14:02 .
drwxrwxrwt. 11 root root 160 Mar 4 14:02 ..
-rwx------ 1 root root 18 Mar 4 14:02 .bash_logout
-rwx------ 1 root root 193 Mar 4 14:02 .bash_profile
-rwx------ 1 root root 231 Mar 4 14:02 .bashrc
(2)删除/tmp/skel/目录,然后拷贝/etc/skel/目录至 /tmp/skel/ ,然后设置属组和其它所有人对/tmp/skel 文件无任何权限
# rm -rf /tmp/skel/
# cp -r /etc/skel/ /tmp
# ll -a /tmp/skel/
total 12
drwxr-xr-x 2 root root 62 Mar 4 14:29 .
drwxrwxrwt. 11 root root 160 Mar 4 14:29 ..
-rw-r--r-- 1 root root 18 Mar 4 14:29 .bash_logout
-rw-r--r-- 1 root root 193 Mar 4 14:29 .bash_profile
-rw-r--r-- 1 root root 231 Mar 4 14:29 .bashrc
# chmod -R go= /tmp/skel/
# ll -a /tmp/skel/
total 12
drwx------ 2 root root 62 Mar 4 14:29 .
drwxrwxrwt. 11 root root 160 Mar 4 14:29 ..
//上一级目录的权限
-rw------- 1 root root 18 Mar 4 14:29 .bash_logout
-rw------- 1 root root 193 Mar 4 14:29 .bash_profile
-rw------- 1 root root 231 Mar 4 14:29 .bashrc
(3)让/tmp/skel/ 目录及目录下的文件,属组的权限设置为可读
# chmod -R g+r /tmp/skel/
# ll -a /tmp/skel/
total 12
drwxr----- 2 root root 62 Mar 4 14:29 .
//当前目录,属组权限已经变为只读
drwxrwxrwt. 11 root root 160 Mar 4 14:29 ..
-rw-r----- 1 root root 18 Mar 4 14:29 .bash_logout
-rw-r----- 1 root root 193 Mar 4 14:29 .bash_profile
-rw-r----- 1 root root 231 Mar 4 14:29 .bashrc
三、文件所有者所属组管理命令chown chgrp
3.1、chown 用于设置文件所有者和文件关联组的命令,命令使用方式有如下2种方式
chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...
选项:
- -R : 处理指定目录以及其子目录下的所有文件
用例:
1、修改/tmp/music/目录及其目录下的文件的属主为mapleleaf
# ll -a /tmp/music
total 4
drwxr-xr-x 2 root root 101 Mar 4 10:14 .
drwxrwxrwt. 13 root root 4096 Mar 5 09:48 ..
-rwxrwxr-x 1 root root 0 Mar 4 10:14 bingyu
-rw-rw-r-- 1 root root 0 Mar 4 10:14 daolang
-rw-r--r-- 1 root root 0 Mar 4 10:14 liudehua
-rw-rw-r-- 1 root root 0 Mar 4 10:14 meirenyu
-rw-r--r-- 1 root root 0 Mar 4 10:14 qianzhihe
-rw------- 1 root root 0 Mar 4 10:14 qinghuaci
# chown -R mapleleaf /tmp/music
# ll -a /tmp/music
total 4
drwxr-xr-x 2 mapleleaf root 101 Mar 4 10:14 .
drwxrwxrwt. 13 root root 4096 Mar 5 09:48 ..
-rwxrwxr-x 1 mapleleaf root 0 Mar 4 10:14 bingyu
-rw-rw-r-- 1 mapleleaf root 0 Mar 4 10:14 daolang
-rw-r--r-- 1 mapleleaf root 0 Mar 4 10:14 liudehua
-rw-rw-r-- 1 mapleleaf root 0 Mar 4 10:14 meirenyu
-rw-r--r-- 1 mapleleaf root 0 Mar 4 10:14 qianzhihe
-rw------- 1 mapleleaf root 0 Mar 4 10:14 qinghuaci
2、修改/tmp/music/目录及其目录下的文件的属主为orange,属组为pork
# chown -R -v orange:plant /tmp/music
# ll -a /tmp/music
total 4
drwxr-xr-x 2 orange plant 101 Mar 4 10:14 .
drwxrwxrwt. 13 root root 4096 Mar 5 09:48 ..
-rwxrwxr-x 1 orange plant 0 Mar 4 10:14 bingyu
-rw-rw-r-- 1 orange plant 0 Mar 4 10:14 daolang
-rw-r--r-- 1 orange plant 0 Mar 4 10:14 liudehua
-rw-rw-r-- 1 orange plant 0 Mar 4 10:14 meirenyu
-rw-r--r-- 1 orange plant 0 Mar 4 10:14 qianzhihe
-rw------- 1 orange plant 0 Mar 4 10:14 qinghuaci
3、修改/tmp/music/目录及其目录下的文件的属主为root,属组为root
# chown -R -v root.root /tmp/music
# ll -a /tmp/music
total 4
drwxr-xr-x 2 root root 101 Mar 4 10:14 .
drwxrwxrwt. 13 root root 4096 Mar 5 09:48 ..
-rwxrwxr-x 1 root root 0 Mar 4 10:14 bingyu
-rw-rw-r-- 1 root root 0 Mar 4 10:14 daolang
...
参考B文件的文件所有者和关联组,修改A文件的相关属性
chown [OPTION]... --reference=RFILE FILE...
4、参考/mp/video文件所有者和所在组,设置/tmp/music具有相同属性
# su - centos
$ touch /tmp/video
cat > /tmp/video <<EOF
fushanxing
2012
fuchouzhelianmeng
jisufeiche
suduyujiqing
gesila
yitiaogoudeshiming
xman
zhuluoji
heibao
duye
EOF
$ su - root
# ll /tmp/video
-rw-rw-r-- 1 centos centos 110 Mar 8 10:28 /tmp/video
# ll -a /tmp/music
total 0
drwxr-xr-x 2 root root 101 Mar 4 10:14 .
drwxrwxrwt. 9 root root 144 Mar 8 10:28 ..
...
# chown -R --reference=/tmp/video /tmp/music
# ll -a /tmp/music
total 0
drwxr-xr-x 2 centos centos 101 Mar 4 10:14 .
drwxrwxrwt. 9 root root 144 Mar 8 10:28 ..
-rwxrwxr-x 1 centos centos 0 Mar 4 10:14 bingyu
-rw-rw-r-- 1 centos centos 0 Mar 4 10:14 daolang
...
3.2、chgrp 用于变更文件或目录的所属群组,命令使用方式有如下2种方式
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
用例:
1、修改/tmp/music/daolang文件的属组为root
# ll /tmp/music/daolang
-rw-rw-r-- 1 centos centos 0 Mar 4 10:14 /tmp/music/daolang
# chgrp root /tmp/music/daolang
# ll /tmp/music/daolang
-rw-rw-r-- 1 centos root 0 Mar 4 10:14 /tmp/music/daolang
2、修改/tmp/music/daolang文件的属组,设置文件bingyu的属组也为root
# ll /tmp/music/
total 0
-rwxrwxr-x 1 centos centos 0 Mar 4 10:14 bingyu
-rw-rw-r-- 1 centos root 0 Mar 4 10:14 daolang
-rw-r--r-- 1 centos centos 0 Mar 4 10:14 liudehua
---
# chgrp --reference=/tmp/music/daolang /tmp/music/bingyu
# ll /tmp/music/bingyu
-rwxrwxr-x 1 centos root 0 Mar 4 10:14 /tmp/music/bingyu
实验
centos组的用户对/tmp/music拥有写权限,对目录下的文件无写权限,切换至以centos为附加组的docker用户。使用docker用户对文件执行修改,删除
# chmod g+w /tmp/music
# ll -a /tmp/music
# chown centos:centos /tmp/music/qianzhihe
# useradd -G centos docker
//创建一个附加组为centos的用户docker
# su - docker
$ echo abc >>/tmp/music/qianzhihe
$ rm /tmp/music/qianzhihe
3.3、Linux umask命令指定在建立文件时预设的权限掩码
查看系统的默认umask
[root@node1 ~]# umask
0022
系统默认创建的文件的权限是644
# ll /tmp/music/feiwu
-rw-r--r-- 1 root root 0 Mar 8 16:23 /tmp/music/feiwu
系统默认创建的目录的权限是755
[root@node1 ~]# ll -d /tmp/music/youyouqiu
drwxr-xr-x 2 root root 6 Mar 8 16:24 /tmp/music/youyouqiu
当然可以使用umask 023,命令去修改当前的umask值,但是此设置仅对当前shell有效
4、作业
[1]创建一个系统用户,附加组为kvm,不指定其家目录,且shell为/sbin/nologin,尝试root切换至此用户,查看其命令提示符
# useradd -r -G kvm -M yangmei
# usermod -s /sbin/nologin yangmei
# su - yangmei
//无法登录杨梅用户
[2]新建GID为3400的组frog,新建用户grass,要求其家目录为/users/grass。密码同用户名
#groupadd -g 3400 frog
# mkdir /users
#useradd -d /users/grass grass
#echo 'grass' | passwd --stdin grass
[3]新建用户cow,其家目录为/users/cow。密码同用户名
#useradd -d /users/cow cow
#echo 'cow' | passwd --stdin cow
[4]新建用户milk,其家目录为/users/milk,删除milk用户,但是保留其家目录
#useradd -d /users/milk milk
#userdel milk
[5]为用户grass和cow新增附加组animals
#groupadd animals
#usermod -a -G animals grass
#usermod -a -G animals cow
[6]复制目录/var/log至/tmp/目录,修改/tmp/log/及其内部所有文件的属组为animals,并让属组用户对目录本身拥有写权限
# cp -r /var/log/ /tmp/
# chown -R :animals /tmp/log/
# chmod -R g+w /tmp/log/
# ll -a /tmp/log/
5、install命令介绍
install 作用是安装或升级软件或备份数据,它的使用权限是所有用户。install命令和cp命令类似,都可以将文件/目录拷贝到指定的地点。但是,install允许你控制目标文件的属性。install通常用于程序的makefile,使用它来将程序拷贝到目标(安装)目录。
有4种使用格式
- install [OPTION]… [-T] SOURCE DEST 复制单文件,到目标文件
- install [OPTION]… SOURCE… DIRECTORY 复制多个文件,到指定目录
- install [OPTION]… -t DIRECTORY SOURCE… 如果给出了-t选项,那么install将使用SOURCE的名称,将每个SOURCE文件复制到指定的目录
- install [OPTION]… -d DIRECTORY… 创建空目录
选项
- --backup[=CONTROL]:为每个已存在的目的地文件进行备份。
- -b:类似 --backup,但不接受任何参数。
- -c:(此选项不作处理)。
- -d,--directory:所有参数都作为目录处理,而且会创建指定目录的所有主目录。
- -D:创建<目的地>前的所有主目录,然后将<来源>复制至 <目的地>;在第一种使用格式中有用。
- -g,--group=组:自行设定所属组,而不是进程目前的所属组。
- -m,--mode=模式:自行设定权限模式 (像chmod),而不是rwxr-xr-x。
- -o,--owner=所有者:自行设定所有者 (只适用于超级用户)。
- -p,--preserve-timestamps:以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性。
- -s,--strip:用strip命令删除symbol table,只适用于第一及第二种使用格式。
- -S,--suffix=后缀:自行指定备份文件的<后缀>。
- -v,--verbose:处理每个文件/目录时印出名称。
- --help:显示此帮助信息并离开。
- --version:显示版本信息并离开。
用例:
5.1、复制/tmp/cars下的 Mercedes-Benz 到/tmp/music/
# mkdir /tmp/cars
# touch /tmp/cars/{Mercedes-Benz,BMW,audi,Cadillac}
# touch /tmp/cars/{jinbei,xiandai,xuefulai,wuling,huangguan,ruizhi}
# install /tmp/cars/Mercedes-Benz /tmp/music/
# ll /tmp/music/Mercedes-Benz
-rwxr-xr-x 1 root root 0 Mar 9 15:44 /tmp/music/Mercedes-Benz
//install 复制文件,会导致文件属主拥有了执行权限,一定要注意
5.2、复制/tmp/cars下的 Mercedes-Benz 到/tmp/music/,设定文件权限为644
# install -m=644 /tmp/cars/Mercedes-Benz /tmp/music/
# ll /tmp/music/Mercedes-Benz
-rw-r--r-- 1 root root 0 Mar 9 15:47 /tmp/music/Mercedes-Benz
5.3、复制/tmp/cars下的 Mercedes-Benz 到/tmp/music/,设定文件权限为644,属主为centos,属组为plant
# install -o centos -g plant -m=644 /tmp/cars/Mercedes-Benz /tmp/music/
# ll /tmp/music/Mercedes-Benz
-rw-r--r-- 1 centos plant 0 Mar 9 15:50 /tmp/music/Mercedes-Benz
5.4、在/tmp/cars目录下创建目录suv
# install -d /tmp/cars/suv
# ll -d /tmp/cars/suv
drwxr-xr-x 2 root root 6 Mar 9 15:53 /tmp/cars/suv
# touch /tmp/cars/suv/{audiq5l,hafuh6,benzglc,bentiancrv,bmwX5}
6、mktemp命令的使用
创建临时的文件或者目录,使用格式如下
mktemp [OPTION]... [TEMPLATE]
选项:
-d 创建一个临时目录
-u 测试是否可以创建文件或者目录,并非会真执行
用例:
6.1 在/tmp/jiangtai目录产生多个兆维.xxxxxx的随机文件
# install -d /tmp/jiangtai
# mktemp /tmp/jiangtai/zhaowei.XXXXXX
//多次执行此命令,会产生需要以zhaowei.开头的文件
# ll /tmp/jiangtai/zhaowei*
-rw------- 1 root root 0 Mar 10 09:57 /tmp/jiangtai/zhaowei.7D5KeT
-rw------- 1 root root 0 Mar 10 09:57 /tmp/jiangtai/zhaowei.9SDyus
-rw------- 1 root root 0 Mar 10 09:57 /tmp/jiangtai/zhaowei.Ahi0Oz
-rw------- 1 root root 0 Mar 10 09:57 /tmp/jiangtai/zhaowei.l7uExm
-rw------- 1 root root 0 Mar 10 09:57 /tmp/jiangtai/zhaowei.SagK9R
-rw------- 1 root root 0 Mar 10 09:57 /tmp/jiangtai/zhaowei.yld1cU
6.2 引入变量的概念,引入命令引用
将随机的文件名保存到变量中,以备后期引用
# lidu=$(mktemp /tmp/jiangtai/lidushuian.XXXXXX)
# echo $lidu
/tmp/jiangtai/lidushuian.1gewNF