1 Linux 的文件权限
Linux 是一个多人多任务环境,为了使各个用户都具有保密的文件数据,此时文件权限管理就很重要了。Linux 一般将文件的可读写身份分为三个类别,分别是:
- 拥有者
owner
(新增用户的使用的是useradd
命令,删除用户使用的是userdel
命令,修改用户信息使用usermod
命令,查看用户信息使用id
命令) - 所属群组
group
(新增用户组使用的是groupadd
命令,删除用户组使用的是groupdel
命令,新增用户到用户组可以使用修改用户信息命令的usermod
) - 其它人
others
而这些身份都各自有 读 read
、写 write
、执行 execute
等权限。
默认的情况下,所有系统上的账号与一般身份用户(包括 root)的相关信息都是记录在
/etc/passwd
这个文件内,而个人密码则是记录在/etc/shadow
这个文件内,而 Linux 所有的组名都记录在/etc/group
中
1.1 Linux 文件属性
使用 ls -Al
命令可以显示一系列文件的文件名与相关属性(ls
就是 List 的意思),如:
如果有文件显示出来就会出现由下图对应的七个文件属性字段:
1.1.1 文件的类型与权限
文件的类型与权限一共有十个字符:
- 第一个字符表示的是这个文件的类型:
- 为
d
时,则表示该文件是目录类型 - 为
-
时,则表示该文件是文件类型,文件类型又可以分为:- 纯文本文件
- 二进制文件,可执行文件就是这种格式
- 数据文件,有些程序在运行的过程当中会读取某些特定格式的文件
- 为
l
时,则表示该文件是链接文件,链接文件就相当于 window 中的快捷方式 - 为
b
时,则表示为设备文件里面的可供存储的周边设备 - 为
c
时,则表示为设备文件里面的串行端口设备,如键盘、鼠标
- 为
- 接下来的字符,以三个字符为一组,均为
rwx
的三个参数组合,r
表示可读,w
表示可写,x
表示可操作,如果没有权限就显示-
,而三个字符组依次分别表示:- 文件拥有者可具备的权限
- 此用户组的权限
- 其它人的权限
值得注意的是,目录与文件的权限意义并不相同,目录的可写权限表示的是可对当前目录中的文件进行增删操作,而文件的可写权限只是对文件有修改的权限并没有删除该文件的权限,而目录的可操作权限则表示可以通过
cd
命令进入该文件目录,可读操作就是可以通过ls
命令获取目录下所有文件的属性信息
1.2 修改文件属性与权限
1.2.1 身份修改命令
chgrp
:修改文件所属用户组,它的语法为:
chgrp [R] dirname/filename
如:chgrp admin /tmp/testing
,其中 -R
表示进行递归修改,即连同子目录下的所有文件、目录都更新为这个用户组。
chown
:修改文件拥有者,它的语法为:
chown [R] dirname/filename
如:chown admin /tmp/testing
1.3.1 修改权限 chmod
使用 cp
命令复制文件给自身之外的其他人时,如将 .bashrc
这个文件复制成为 .bashrc_test
时,复制操作会同时复制执行者的属性与权限
cp .bashrc .bashrc_test
此时需要修改该文件的拥有者,用户组或修改基础权限了。
Linux 文件的基础权限有9个,分别是拥有者、用户组,其他人三种身份都各有自身的读、写、执行权限。
- 数字类型修改文件权限
我们可以使用数字来代表各个权限,各权限的对照表如下:
r:4
w:2
x:1
每种身份各自的三个权限的数字是可以叠加,如 rwx
的叠加数字为 7
,而设置权限的时候就如下:
chmod 777 fileName
1.3.2 文件的默认权限 umask
在建立一个文件或目录的时候,它的默认权限则与 umask
有关了,基本上,umask
就是指定目前用户在
建立文件或目录时候的权限默认值,可以直接使用 umask
命令或者添加参数 -S
获取 umask
数值,如:
[root@study ~]# umask
0022
[root@study ~]# umask -S
u=rwx,g=rx,o=rx
上述例子的数字类型权限设置值为 0022
,其中第一组为特殊权限,后三组就是上文提到过权限组。要注意的是 umask
的数字指的是 该默认值需要减掉的权限,即由于 r
、w
、x
分别是 4
、2
、1
,当权限为 rw
时,减掉的数值就该是 x
的数值 1
。
同时,在默认权限的属性上,目录与文件是不一样的,默认情况下:
- 若用户创建为文件则 默认没有可执行
x
权限,因此如果全为rw
,此时umask
的数值为000
(无需减掉x
权限数值) - 若用户建立为目录则默认为所欲权限均开放,即
umask
的数值为000
想要修改 umask
数值可以直接在使用 umask
命令紧接数字类型的权限设置值,如:
umask 002
1.3.3 文件特殊权限
有时候在查看一些文件权限值的时候,可能会意外发现除了 r
,w
,x
外,还存有其它特殊的权限值 s
与 t
,这两个特殊的字母的意义与系统的账号以及系统的进程管理有关。这两个字母出现的位置不同,代表的意义都不同。
1.3.3.1 Set UID
当 s
标志出现在文件拥有者的 x
权限上时,如 -rwsr-xr-x
,此时就称为 Set UID
,简称 SUID,基本上 SUID 有以下限制与功能:
- SUID 权限仅对二进制程序有效
- 执行者对于该程序需要有
x
的可执行权限 - 本权限仅在执行该程序的过程中有效
- 执行者将具有该程序拥有者(owner)的权限
举例子,passwd
命令的权限就是 -rwsr-xr-x
,在 Linux 中所有的账号密码都记录在 /etc/shadow
这个文件上,该文件的权限为仅有 root 可读且仅有 root 可以强制写入,但个体用户却可以使用 passwd
命令修改自己的密码,这是因为:
- 个体用户对
/usr/bin/passwd
这个程序具有x
的权限 /usr/bin/passwd
的拥有者是 root- 当个体用户执行
passwd
的过程中,会暂时获取 root 的权限 /etc/shadow
此时就可以被个体用户所执行的passwd
命令所修改
1.3.3.2 Set GID
与 SUID 类似,不过 SGID 针对的是文件或目录设置的,即:
- SGID 权限仅对二进制程序有效
- 执行者对于该程序需要有
x
的可执行权限 - 执行者在执行的过程中将会获得该程序用户组的支持
1.3.3.3 Sticky Bit
SBIT 只针对目录有效,它的作用是:
- 当用户对此目录具有
w
、x
权限,即具有写入的权限; - 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件
1.3.4 文件的隐藏属性
文件的隐藏属性对系统安全上面有着非常重要的作用,在 ext2
、ext3
、ext4
的 Linux 传统文件系统上可以使用 chattr
命令来为文件添加一些隐藏属性,chattr
语法如下
chattr [+-=] [ASacdistu] 文件或目录名称
以下主要是一些常用的选项与参数:
+
:增加某一个特殊参数,其它原本存在的参数保持不变-
:删除某一个特殊参数,其它原本存在的参数保持不变=
:直接设置参数,其它原本存在的参数会被覆盖A
:当设置了这个属性值,它的存取时间atime
将不会应存取这个文件或目录而修改S
:一般的文件都是非同步地写入磁盘的,当设置该属性,当进行文件修改的时候,该修改会同步写入磁盘a
:当设置了这个属性值,该文件就只能增加数据,而不能删除和修改数据c
:当 dump 程序被执行的时候,设置d
属性可让文件或目录不被 dump 备份i
:当设置了这个属性值,该文件就不能被删除、改名、设置链接、也无法写入或新增数据s
:当设置了这个属性值,此时该文件被删除,就将完全从硬盘中删除,无法恢复u
:与s
相反,删除后可以恢复该文件
使用 lsattr
命令可以显示文件的隐藏属性,语法如下:
lsattr [-adR] 文件或目录名称
以下主要是一些常用的选项与参数:
-a
:将隐藏文件的属性也显示出来-d
:如果接的目录,仅列出目录本身的属性而非目录内的文件名-R
:连同子目录的数据也一并显示出来
2 Linux 目录配置
FHS(FileSystem Hierarchy Standard)标准,它的目的是希望让用户可以了解到已安装软件通常放置在哪个目录下。FHS 依据文件系统使用的频繁与否是否允许用户随意修改,而将目录定义为四种交互作用的形态,用表格表示:
可分享 | 不可分享 | |
---|---|---|
不变 | /usr (软件存放处) | /etc (配置文件) |
/opt (第三方辅助文件) | /boot (启动与内核文件) | |
可变 | /var/mail (用户邮箱) | /var/run (程序相关) |
/var/spool/news (新闻组) | /var/lock (程序相关) |
以下是一些我觉得需要记录一下根目录底下的目录类型
/bin
:放置的是在的人维护模式下还能够被使用的命令(能被 root 与一般账号所使用)/dev
:任何设备与接口设备都是以文件的形式存放在这个目录当中/lib
:放置的是启动是会用到的函数库,以及在/bin
或/sbin
下面的命令会调用的函数库/media
:放置的是可删除的设备如软盘,光盘等
2.1 $PATH
环境变量
如同 window 一样,Linux 都有一个环境变量 $PATH
,使用以下命令可以打印出环境变量的路径,其中不同的路径会使用 :
分隔开,值得注意的是不同的用户的 $PATH
变量都是不同的:
echo $PATH
而想要添加环境变量,比如添加 /root
到环境变量,就可以使用以下命令:
PATH="${PATH}:/root"
3 目录管理
在接触目录的相关操作之前,需要先了解一下比较特殊的目录:
.
:代表此层目录..
:代表上一层目录-
:代表前一个工作目录~
:代表目前使用者身份所在的家目录~account
:代表account
这个使用者的家目录
下面就是几个常用的处理目录的命令:
cd
(Change Directory):切换目录pwd
(Print Working Directory):显示当前目录mkdir
:建立一个新目录rmdir
:删除一个 空 目录
其实觉得只要会用了 man
以及 --help
,具体的用法都可以不用记牢,所以以下对一些命令参数做一下提醒。
3.1 mkdir
创建新目录的命令语法如下:
mkdir [-mp] 目录名称
-m
:设置文件的权限,不使用默认权限,如:mkdir -m 711 test2
-p
:创建目录递归创建,如:mkdir -p test1/test2/test3
,同样删除目录的时候,使用-p
也是相同效果
3.2 ls
ls
命令用于显示当前目录内的文件和目录的详情,具体语法是:
ls [-aAdfFhilnrRSt] 文件名或目录名称
ls [--color={never,auto,always}] 文件名或目录名称
ls [--full-time] 文件名或目录名称
以下主要是一些常用的选项与参数:
-a
:显示全部文件,连同隐藏文件-A
:显示全部文件,连同隐藏文件,但不包括.
与..
这两个目录-d
:仅显示目录本身,不显示目录内的文件-l
:详细信息显示,包含文件的属性与权限等数据--full-time
:输出完整时间模式--color={never,auto,always}
:显示颜色
4 文件管理
4.1 cp
要复制文件就使用 cp
(copy)命令,除了单纯地复制之外,它还可以建立链接文件,对比两文件的新旧而予以更新,以及复制整个目录等功能,语法:
cp [-adfilprsu] 源文件 目标文件
cp [options] source1 source2 source3...
以下主要是一些常用的选项与参数:
-a
:相当于-dr --preserve=all
的意思-d
:若源文件为链接文件,则复制链接文件属性而非文件本身-i
:若目标文件已存在是,在覆盖是先询问用户-p
:连同文件的属性一起复制过去,而非使用默认属性值-r
:递归复制,用于目录的复制操作--preserve=all
:除了-p
的权限参数外、还添加SELinux
属性,links、xattr 等都复制
4.2 rm
rm
命令用于删除文件或目录,具体语法:
rm [-fir] 文件或目录
-f
:忽略不存在的文件-i
:交互模式,删除前会询问用户-r
:递归删除
4.3 mv
移动文件与目录或重命名,具体语法:
mv [-fiu] source destination
mv [options] source1 source2.... directory
-f
:如果目录文件已经存在,不会询问而直接覆盖-i
:交互模式-u
:若目标文件已经存在,而 source 比较新,才会进行更新
mv
命令重命名的方式很简单,如下就实现了重命名功能了:
mv testing1 testing2
4.4 获取路径地文件名称与目录名称
每个文件的完整文件名都包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达 255 个字符。使用 basename
能获取到文件名,而使用 dirname
能获取到目录名,如:
[admin@localhost /]$ basename /tmp/testing
testing
[admin@localhost /]$ dirname /tmp/testing
/tmp
4.5 文件内容查看
如果需要查看一个文件的内容,可以使用以下这些命令:
cat
:由第一行开始显示文件内容tac
:从最后一行开始显示nl
:显示的时候同时输出行号more
:一页一页地显示文件内容less
:与more
类似,但可以往前翻页head
:只看前面的几行tail
:只看后面的几行od
:以二进制的方式读取文件内容
4.5.1 cat
cat
其实是英文 Conactenate 的缩写,主要是将一个文件的内容连续打印到屏幕上面,它的具体语法:
cat [-AbEnTv]
以下主要是一些常用的选项与参数:
-b
:列出行号,仅针对非空白行做行号显示、空白行不标行号-n
:列出行号,连空白行都做行号显示-A
:列出一些看不出的特殊字符,将[tab]
键以^I
显示出来,结尾的换行符以$
显示出来
4.5.2 more
有时候当你的文件内容行数超过40行以上,或许就根本来不及看屏幕上的内容了,此时就需要使用到 more
或 less
命令进行翻页查询的工作了。
more
命令使用后,你有几个按键可以使用(其实跟使用了 man
命令时差不多):
空格键
:代表向下翻一页Enter
:代表向下翻一行b
:代表往回翻页/字符串
:查找关键字,输入后按回车,想要重复查找同一个字符串,可以直接按下n
即可:f
:显示文件名以及目前显示的行数q
:代表离开
4.5.3 less
less
命令与 more
命令功能类似,less
命令使用后,你可以使用以下几个按键:
空格键
:向下翻动一页[pagedown]
:向下翻动一页[pageup]
:向上翻动一页/字符串
:向下查找字符串的功能?字符串
:向上查找字符串的功能呢n
:重复前一个关键字查找N
:反向重复前一个关键字查找g
:前进到这个数据的第一行G
:前进到这个数据的最后一行q
:离开
4.6 修改文件时间或创建新文件
touch
命令可以创建一个空的文件,语法是:touch fileName
,如:
touch testtouch
touch
命令还能修改原有的文件时间,当使用 ls -l
命令附加 --time
参数的时候,赋值的类型不同,可以获取三个主要变动的时间,分别是
- 修改时间(modification time):默认地不添加
--time
参数的时候,输出打印的就是修改时间,当该文件的内容数据变更的时候就会更新该事件,内容数据指的是文件内容,而不是文件的属性或权限 - 状态时间(status time):使用
--time=ctime
参数的时候,输出打印的就是状态时间,当文件的状态改变的时候,就会更新该时间,如修改权限与属性 - 读取时间(access time):使用
--time=atime
参数的时候,就会更新这个读取时间,比如使用了cat
命令读取了该文件
此时想要变更时间就可以使用到 touch
命令,语法如下:
touch [-acdmt] fileName
以下主要是一些常用的选项与参数:
-a
:修改了状态时间和读取时间,定义的时间为当前时间-c
:修改文件的时间(就是上述的三个时间),若该文件不存在则不建立新文件-d
:后面可以接自定义的时间而不是默认的当前时间,此时定义的是修改时间以及读取时间-m
:仅定义修改时间(modificationn time)-t
:后面可以自定的时间而不是默认的当前时间,格式为[YYYYMMDDhhmm]
,此时定义的是修改时间以及读取时间
4.7 命令与文件的查找
4.7.1 脚本文件的查找
查找命令的完整文件名可以使用 which
或 type
命令进行查找,如使用 which
命令查找执行文件,语法如下:
which [a] command
以下主要是一些常用的选项与参数:
-a
:将所有由PATH
目录中可以找到的命令均列出,而不止第一个被找到的命令名称
需要注意的是,which
命令是根据 PATH
这个环境变量所规范的路径,去查找执行文件的文件名,而比如 history
这种 bash 内置的命令,which
命令是无法查找得到的。此时就需要使用到 type
命令了。
4.7.2 文件的查找
文件的查找命令常用的有三个,分别是 whereis
、locate
、find
。通常 find
不是很常用,因为除了速度慢之外,也很影响硬盘的性能,一般的,我们会使用 whereis
和 locate
命令。
因为 whereis
命令只找系统中某些特定目录下面的文件而已,而 locate
则是利用数据库来查找文件名,并且没有实际查找硬盘内的文件系统状态,所以比较省时间。
whereis
命令的语法如下:
whereis [-bmsu] 文件或目录名
以下主要是一些常用的选项与参数:
-l
:列出whereis
会去查找的几个主要目录-b
:只找 binary (二进制)格式的文件-m
:只找在说明文件manual
路径下的文件-s
:只找source
源文件-u
:查找不在上述三个项目当中的其他特殊文件
locate
命令来寻找数据特别快,这是因为它寻找的数据是由已建立的数据库 /var/lib/mlocate/
里面的数据所查找的,而不是直接在硬盘当中读取数据,它的语法如下:
locate [-iclSr] keyword
keyword
就是模糊查找,即使用部分文件名即可,以下主要是一些常用的选项与参数:
-i
:忽略大小写差异-c
:不输出文件名,仅计算找到的文件数量-l
:仅输出几行的意思,例如输出五行则是-l 5
-S
:输出locate
所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等-r
:后面可以接正则表达式的显示方式
正常情况下,CentOS 7.x 是每天会更新数据库一次,所以如果刚新建起来的文件,马上使用 locate
命令查找会显示查询不到,此时可以使用 updatedb
命令强制更新数据库。
find
命令的语法如下:
find [PATH] [option] [action]
PATH
:顾名思义就是要查找的路径,以下主要是一些常用的选项与参数:
-mtime n
:n
为数字,意思为在 n 天之前的一天之内被修改过的内容的文件-mtime +n
:列出在 n 天之前(不包含 n 天本身)被修改过内容的文件-mtime -n
:列出在 n 天之内(含 n 天本身)被修改过内容的文件-newer file
:file
为一个存在的文件,列出比file
还要新的文件-uid n
:n
为数字,这个数字是使用者的 ID,即 UID,这个 UID 记录在/etc/passwd
里面-gid n
:n
为数字,这个数字是用户组名称的 ID,即 GID,这个 GID 记录在/etc/group
里面-user name
:name
为使用者账号名称-group name
:name
为使用组名称-nouser
:查找文件的拥有者不在/etc/passwd
文件中,比如查找一些由网络下载而来的文件-nogroup
:查找文件的拥有组别不在/etc/group
文件中,比如查找一些由网络下载而来的文件-name filename
:查找名为filename
的文件-size [+-] SIZE
:查找比SIZE
还要大+
或 小-
的文件,这个SIZE
的规格有:c
代表 Bytes,k
代表 1024 Bytes,所以要找比 50KB 大的文件,可以使用-size +50k