1. chmod命令简介
chmod命令用于改变Linux系统文件或目录的访问权限。Linux系统上的权限表达方式有两种:一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
文件或目录的权限分为可读、可写、可执行。其中可执行对文件来说,只有二进制或脚本文件,可执行的权限才有意义。对于目录,如果没有可执行权限,表明用户不能进入该目录浏览文件。
文件或目录的可读、可写、可执行的权限是针对某一个用户或者某一组用户而言的。
Linux上有三种不同类型的用户,他们分别是文件拥有者、同组成员、其它成员。
默认情况,用户属于跟用户名相同的组名。比如用户abc,默认情况下,他属于abc的组,当然也可以再加入某些组,比如组123。这时,abc用户同时属于abc组和123组。
2. 先来了解一下Linux的基本权限
找一个文件来做案例:zcwyou.txt
[root@zcwyou ~]# ll zcwyou.txt
输出结果为:
-rw-r--r--. 1 root root 926 Nov 20 10:23 zcwyou.txt
为方便解释输出结果,本文作者需要自定义字段:
这里以空格为分隔符,空格两边各为一个字段。
第1个字段:-rw-r--r--.
第2个字段:1
第3个字段: root
第4个字段:root
第5个字段:926
第6个字段:Nov
第7个字段:20
第8个字段:10:23
第9个字段:zcwyou.txt
2.1 解释第一个字段
-rw-r--r--. 1 root root 926 Nov 20 10:23 zcwyou.txt
第1个字段为:-rw-r--r--.
其中第一个符号-表示这是一个普通文件,而文件的类型有以下几种情况:
2.1.1 -表示该文件是一个普通文件
2.1.2 d表示该文件是一个目录,字母”d”,是dirtectory(目录)的缩写
例如:
[root@zcwyou ~]# ls -ld 888
输出结果:
drwxr-xr-x. 2 root root 6 Nov 24 17:46 888
表明888是一个目录,因为它的第一个符号是d。
注意:目录或者是特殊文件,这个特殊文件存放其他文件或目录的相关信息
2.1.3 l表示该文件是一个链接文件。字母”l”是link(链接)的缩写,类似于windows下的快捷方式
例如:
[root@zcwyou ~]# ll abc123.txt
输出结果:
lrwxrwxrwx. 1 root root 8 Nov 24 09:23 abc123.txt -> test.txt
可以看到,这是一个链接文件,指向当前目录的另一个文件test.txt
2.1.4 b的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)
例如:
[root@zcwyou ~]# ll /dev/sda
brw-rw----. 1 root disk 8, 0 Sep 26 15:57 /dev/sda
2.1.5 c表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节
例如:
[root@zcwyou ~]# ll /dev/pts/0
输出结果如下
crw--w----. 1 root tty 136, 0 Nov 24 17:57 /dev/pts/0
表明这是一个字符设备文件
2.1.6 p表示该文件为命令管道文件。与shell编程有关的文件
2.1.7 s表示该文件为sock文件。与shell编程有关的文件
2.1.8 理解第1个字段权限信息
文件类型后面跟着是文件权限,我们再看看刚才第一个字段的输出:
-rw-r--r--.
文件权限指的是rw-r--r--.
rw-r--r--.
这里共10个字符。从左至右,1-3个字符表示文件拥有者的权限。4-6个字符表示文件拥有者所有的同组成员的权限,7-9个字符,表示其他用户的权限,即既不是文件拥有者,也不与拥有者相同一组的其他用户权限。最后一个字符.表示文件的特殊权限,不在本文的讨论范围。
说明一下权限英文表达方式:
r表示read only,只读
w表示write,可写
x表示Execute,可执行。x权限只有对二进制文件、脚本、目录才有意义。如果是一个普通的文本文件,x权限是没有意义的,比如记事本文件、excel表格、ppt之类的文件,并不需要x权限。
来看看一个具有x权限的文件
wget是一个网络下载工具,假设它已经成功安装。
[root@zcwyou ~]# ll /usr/bin/wget
输出结果
-rwxr-xr-x. 1 root root 418736 Oct 27 2017 /usr/bin/wget
输出结果从左至右。-表示这是一个普通的文件。rwx表示文件拥有者,即root具有可读、可写可修改、可执行的权限。r-x表示root组里的所有成员都有可读可执行的权限,但不能写和修改。r-x表示其他用户都有可读可执行的权限,但不能写和修改。所以系统里的所有用户都可以使用该程序。
权限还有一种表述的方法,用数字表示。
r=4
w=2
x=1
它们用2的N次方分别表示可读可写可执行。
拿两个文件说明:
系统文件/etc/passwd保存着用户信息
[root@zcwyou ~]# ll /etc/passwd
结果:
-rw-r--r--.
1 root root 922 Nov 24 09:26 /etc/passwd
可以看到该文件的数字权限表达为:
文件拥有者:rw-=4+2+0=6
文件拥有者同组成员:r--=4+0+0=4
其他用户:r--=4+0+0=4
即该文件的数字权限为:644
这里的符号-表示0,即没有权限。也就是说,该文件的数字权限为644,当然,这里不考虑最后一个符号.特殊权限位。
再来看另一个文件,curl是一个http/https/ftp等等协议的传输工具,演示的本机已经成功安装curl。
[root@zcwyou ~]# ll /usr/bin/curl
执行结果:
-rwxr-xr-x. 1 root root 156736 Apr 13 2018 /usr/bin/curl
可以看出,该文件的数字权限为
文件拥有者:rwx=4+2+1
文件拥有者同组成员:r-x=4+0+1
其他用户:r-x=4+0+1
即该文件的数字权限为755。
这里的符号-表示0,即没有权限。也就是说,该文件的数字权限为755,当然,这里不考虑最后一个符号.特殊权限位。
2.2 解释第2个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第二个字段用数字表达, 以上例子是1,表示该文件拥有硬链接数为1,意思是该文件只有一个硬链接,默认情况下,所有新创建的文件都只有它自己一个链接。
当然也有其他数字的,比如:
[root@zcwyou ~]# ll latest.tar.gz
执行结果:
-rwxr-xr-x. 2 root root 8743850 Oct 11 15:00 latest.tar.gz
可以看出,这个文件的硬链接数为2。表明该文件拥有另一硬链接(链接有两种,一种软链接,一种硬链接),你可以理解为影子或者分身。
其中链接文件分为硬链接或符号链接两种。
硬链接:多个指向同一文件。硬链接文件大小完全相同,如有多个硬链接,所链接的文件只是一个文件大小。
同一个文件所有的文件都是等价的,操作系统不区分链接创建的先后顺序,若一个文件存在两个链接,那么除去一个文件还可以通过另外一个文件来访问该文件,也可以除去创建链接时用到的文件,但只要还有一个链接存在,就可通过该连接访问文件。
符号链接(软链接):建立一个独立的文件,这个文件会让数据的读取指向它链接的文件内容。类似windows快捷方式。
查看一个目录
[root@zcwyou ~]# ll -ld ./gzip/
输出结果:
drwxr-xr-x. 4 root root 84 Nov 24 17:45 gzip
如果是一个目录,该数字表示目录下有多少个子目录。注意的是,Linux里的目录默认都含有两个子目录,一个是当前目录,用符号.表示,一个是上一级目录,用符号..表示。这里的4表明,该目录还有其他2个非默认目录。我们来看看这个目录的真正内容:
[root@zcwyou ~]# ls ./gzip/ -aF | grep '/$'
./
../
123/
gziptest/
我们发现目录gzip里真的有4个子目录,2个是自带的,分别是.当前目录,..上一级目录。其他两个分别是123和gziptest。注意一下,这里子目录数仅仅统计这一层的,假设子目录123里面还有子目录,这个并不计算在该数值里。
2.3 解释第3个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第3个字段是root,表示该文件的创建者或者拥有者。
2.4 解释第4个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第4个字段同样是root,表示与该文件的创建者同组成员的权限,即同组的其他成员权限。
2.5 解释第5个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第5个字段是926,表示文件大小,文件所占用的空间默认以字节为单位。当然,你可以用命令ll -h
来自动转换最大的单位,即满1M以M显示,满1G以G显示。
2.6 解释第6个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第6个字段表示文件(目录)最近访问(修改)时间,月份。
2.7 解释第7个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第7个字段表示文件(目录)最近访问(修改)时间,日。
2.8 解释第8个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第8个字段表示文件(目录)最近访问(修改)时间,小时与分钟。
2.9 解释第9个字段
-rw-r--r--.
1 root root 926 Nov 20 10:23 zcwyou.txt
第9个字段为该文件名或者目录名。
3. chmod常见用法案例
代码说明:u表示user文件拥有者,g表示group组成员,o表示other其他用户,a表示all,即all=u+g+o
为zcwyou.txt这个文件修改权限,user添加x权限,group添加w权限,o不变。
[root@zcwyou ~]# chmod u+x,g+w zcwyou.txt
设置zcwyou.txt文件权限,文件拥有者的权限为rwx,组员的权限为rw,其他用户的权限为r。
[root@zcwyou ~]# chmod u=rwx,g=rw,o=r zcwyou.txt
设置abc.sh的权限,所有用户都可以拥有执行权限
[root@zcwyou ~]# chmod a+x abc.sh
根据数字设置权限,修改zcwyou.sh的权限为rwxr-xr-x。
[root@zcwyou ~]# chmod 755 zcwyou.sh
修改/home/zcwyou/abc及其下所有深度的子目录设置权限为755
使用选项-R
[root@zcwyou ~]# chmod -R 755 /home/zcwyou/abc
4. chmod的选项
u 表示user用户,即文件或者目录拥有者。
g 表示group组,即文件或者目录拥有者所对应的组。
o 表示others,即其它用户
a 表示all,所有用户,也是系统默认使用此项
+ 表示添加权限
– 表示取消权限,例如取消其他用户的执行权限chmod o-x abc.txt
= 表示设置的目标权限
r 表示read,可读权限。
w 表示write,可写可修改权限
x 表示Execute,可执行权限
– 表示没有权限,例如:chmod u=rwx zcwyou.txt
X 如果目标文件是可执行文件或目录,可给其设置可执行权限,因为普通文件的可执行权限并没有意思。
s 设置特殊权限suid和sgid,使用权限组合“u+s”设定文件的用户的ID位,“g+s”设置组ID位
t 设置特殊权限,只有目录或文件的所有者才可以删除目录下的文件
-c或--changes
# 作用类似“-v”参数,但仅汇报更改的部分,如果文件权限已经改变,显示其操作信息;
-f或--quiet
或--silent
静默操作,即不显示提示信息。
-R或--recursive
递归处理,即处理当前目录和当前目录下所有文件和所有深度的目录和及子目录的文件。
-v或--verbose
显示命令运行时的详细执行过程;
--reference
=<参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
--help
打印帮助信息
--version
查询chmod版本
5. 总结
chmod是一个使用极为频繁的命令,也是Linux运维人员必须掌握的核心命令之一,初学都必须理解数字与字母权限之前的联系。
评论前必须登录!
注册