Linux系统文件和目录的属性及权限

时间:2024-03-04 16:00:37

1 文件属性概述

Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、硬链接数、所归属的用户和用户组、最近修改时间等内容(文件名严格来说不属于文件的属性):

         下面是我们执行ls –lih命令显示的结果:

文字解释
第一列:inode索引节点编号(如人的身份证全国唯一)
    系统读取文件是首先通过文件名找到inode(全称:index node),然后才能读取文件到内容
第二列:文件类型及权限
    共有10个字符,第一个字符代表为文件类型(-代表file,d代表directory),后九个字符代表为文件的权限(读、写、执行)
第三列:文件的硬链接个数
    硬链接的个数好比对源文件的备份,对同一个文件的访问提供多个不同的入口,即使源文件删除了,我们依然可以访问文件本身的内容。
   例如:一个超市有多个进出口,即使其中任何一个进出口封闭,我们依然可以去购物买到我们想要得东西 第四列:文件或目录所属的用户  属主,即创建文件的用户(文件的拥有者),当然我们也可以通过chown修改文件的拥有者 第五列:文件或目录所属的组  这里文件的所属用户组不是用户默认的用户组,我们可以授权给不同的用户组使其文件属于其组 第六列:文件或目录的大小 第七、八、九列:文件或目录的修改时间  查看文件属性里面的时间就是文件的修改时间mtime(全称:modify
time) 第十列:实际的文件名或目录名  文件名是不属于文件的属性列表,文件名实际是属于它上一级目录的block块的内容

2 索引节点inode

2.1 inode概述

硬盘要存储数据(房子住人),首先要分区(隔断),然后要格式化创建文件系统(装修),最后存储数据(住人)。

         Inode中文意思是索引节点(全称:index node)。在每个linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘……)被格式化为ext4(Centos6.7)文件系统后,一般会生成两部分:第一部分是Inode索引节点(很多个),第二部分是Block(很多个)

         Block是用来存储实际数据用的,例如:照片、视频、音乐等普通文件数据。

         Inode是用来存储这些数据的属性信息(也就是ls –l的结果),inode包含的属性信息包括文件的大小、属主、归属的用户组、读写执行权限、文件类型、修改时间,还包含指向文件实体(block块)的指针功能(inode节点—block块的对应关系)等,inode里面唯独不包含文件名。

         Inode除了记录文件属性的信息外,还会为每个文件进行信息索引(指向文件实体的指针),所以就有了inode的数值。Linux操作系统根据指令,即可通过inode的值最快的找到相对应的文件实体。

文件—inode—block之间的关系图:

举例说明:
    学校教室门口贴一张纸(inode),上面有学生的位置信息,以及学生的身高,体重等信息,座位就相当于block。

当我们使用ls查看某个文件或目录时,如果加上-i参数,就可以看到inode节点了,也可以使用stat查看inode以及其他的文件属性;比如文件—inode—block之间的关系图对应的例子:

方法一:ls –li 查看文件属性
[root@oldboy ~]# ls -li Wolf_File
410472 -rw-r--r-- 1 root root 12 Apr 13 23:08 Wolf_File
方法二:stat查看文件属性:
[root@oldboy ~]# stat Wolf_File 
  File: `Wolf_File\'
  Size: 12              Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 410472      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-04-13 23:08:56.841301484 +0800  #文件的查看时间
Modify: 2018-04-13 23:08:51.633299332 +0800  #文件的修改时间
Change: 2018-04-13 23:08:51.633299332 +0800  #文件权限改变的时间
[root@oldboy ~]#

 第一列inode值是410472;查看一个文件或目录的inode,通过ls命令的-i参数即可。

         因为inode要存放文件的属性信息及指向文件实体的指针索引信息,所以每个inode本身是有大小的,Centos5 系列inode的默认大小是128字节(byte),

Centos6系列 inode的默认大小是256字节(byte),inode的大小在分区被格式化创建文件系统之后定下来的,格式化以后就无法更改inode的大小了,格式化前可以通过参数指定inode的大小,

但是一般企业工作环境没有这个需求。

         不同Centos版本inode大小不同:

Centos6系列查看inode大小:
[root@oldboy ~]# dumpe2fs /dev/sda1 | grep -i "inode size"  ##/boot分区默认为128byte
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               128
[root@oldboy ~]# dumpe2fs /dev/sda3 | grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               256
Centos5系列查看inode大小:
由于我这里没有Centos5系统版本,想验证的可自行安装Centos5系统,使用dumpe2fs /dev/sda3 | grep -i "inode size"命令去查看。

2.2 inode总结

################学会给阶段性的知识做小结是学好linux运维的好习惯################

u  硬盘被分区并格式化为ext4文件系统后会生成一定数量的inodeblock

u  inode称为索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)

u  ext3/ext4文件系统的block存放的是文件的实际内容

u  inode是磁盘上的一块存储空间,Centos6系列版本非启动分区inode默认大小为256byteCentos5系列版本inode默认大小为128byte

u  inode的表现形式是一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的

u  linux文件系统中,inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口

u  ext3/ext4文件系统下,一个文件被创建后至少要占用一个inode和一个block

u  ext3/ext4文件系统下,正常情况一个文件占用且只能占用一个inode(人和身份证)

u  block是用来存储实际数据的,每个block的大小一般有1k,2k,4k几种;其中引导分区等为1k,其他普通分区多为4kCentos6

u  如果一个文件很大(高清大片4G),需要占多个block,如果文件很小(0.01k),至少占一个block,并且这个block的剩余空间就浪费了,即无法再存储其他数据了

u  查看inode大小和总量

[root@oldboy ~]# dumpe2fs /dev/sda3 | grep -iE "block size|inode size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096
Inode size:               256
[root@oldboy ~]# dumpe2fs /dev/sda3 | grep -iE "block count|inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              577088
Block count:              2307840
Reserved block count:      115392
注意:默认block count一般会大于inode count的数量

   u  查看inode的总量是使用量(df -i

[root@oldboy ~]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      577088 52769 524319   10% /
tmpfs           60785     1  60784    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot
/dev/sr0            0     0      0     - /mnt

   u  查看文件的inode信息

方法一:ls –li文件inode
[root@oldboy ~]# ls -li /etc/hosts
40 -rw-r--r--. 2 root root 158 Jan 12  2010 /etc/hosts
方法二:stat查看文件inode
[root@oldboy ~]# stat /etc/hosts
  File: `/etc/hosts\'
  Size: 158             Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 40          Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-04-20 00:00:50.701998104 +0800
Modify: 2010-01-12 21:28:22.000000000 +0800
Change: 2018-03-24 22:24:01.221267767 +0800

u  如何生成及指定inode大小

格式化/dev/sdb1分区时指定inode大小为256byte,block大小为2048字节即2k:
[root@oldboy ~]# mkfs.ext4 -b 2048 -I 256 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=2048 (log=1)
分块大小=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
66528 inodes, 530128 blocks
26506 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=537919488
33 block groups
16384 blocks per group, 16384 fragments per group
2016 inodes per group
Superblock backups stored on blocks: 
        16384, 49152, 81920, 114688, 147456, 409600, 442368

正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
查看inode和block的大小:
[root@oldboy ~]# dumpe2fs /dev/sdb1 | grep -iE "block size|inode size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               2048
Inode size:               256
查看inode和block总量:
[root@oldboy ~]# dumpe2fs /dev/sdb1 | grep -iE "block count|inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              66528
Block count:              530128
Reserved block count:     26506

2.3 Block总结

u  磁盘读取数据是按block为单位读取的

u  一个文件可能占用多个block,同时每读取一个block就会消耗一次磁盘I/O

u  如果要提升磁盘I/O性能,那就要尽可能一次性读取数据尽量的多

u  一个block只能存放一个文件的内容,无论内容有多小,如果block默认是4K大小,那么存放一个1K的文件,剩余3K的就不能再存放别的文件,只能浪费了

u  Block并非越大越好,block太大对于存放小文件就会浪费磁盘空间,例如:1000K的文件;block大小为4K,占用250block,如果block默认为1K,则需要占1000block

 访问效率谁更高?消耗I/O分别250次和1000次;当然是block大小为4K时访问效率更高

u  根据业务需求,确定默认的block大小,如果是大文件(大于16K)一般设置block大一点,小文件(小于1K)一般设置block小一点

u  Block太大,例如4K,文件都是0.1K的则会大量浪费磁盘空间,但是访问效率高

u  Block太小,例如1K,文件都是1000K的则会消耗大量的磁盘I/O,访问效率比较低

u  Block大小设置也是格式化分区时确定的,命令为mkfs.ext4 -b 2048 -I 256 /dev/sdb1

u  企业里文件都会比较大(一般会大于4K),block设置大一些会提升磁盘访问效率

u  ext3/ext4文件系统(Centos56),一般都设置为4KCentos7默认文件系统为xfs

2.4 inode与block汇总

u  磁盘被分区格式化文件系统后,会分为inodeblock两部分内容

u  Inode存放文件的属性以及指向文件实体的指针,文件名不包含在inode里,一般是存放在上级目录的block

u  访问文件过程原理:文件名àinodeàblocks

u  Inode一般情况默认大小为256byteblock大小为1K2K4K,默认为4K,注意:引导分区/boot等特殊分区除外

u  通过df –i查看inode的数量以及使用情况,dumpe2fs /dev/sda3查看inodeblock的大小及总数量

u  一个文件至少要占用一个inode和一个block,多个文件可以占用同一个inode(硬链接),即相同文件

u  一个block只能被一个文件使用,如果文件很小block很大,剩余空间浪费,无法继续被其他文件使用

u  Block不是越大越好,要根据业务的文件大小进行选择,一般Centos6就是默认4K

u  可以在格式化分区时指定inodeblock大小(mkfs.ext4 -b 2048 -I 256 /dev/sdb1

3 文件类型

3.1 Linux文件类型概述

linux系统,可以说一切(包括目录、普通文件、设备等)皆文件。文件类型包含有普通文件、目录、字符设备文件、块设备文件、符号链接文件、管道文件等等

图一 文件类型对应说明图

文件类型标识

文件类型说明

ddirectory

表示这是一个目录

-regular file

表示这是一个普通文件

llink

表示这个一个符号链接文件,实际上它指向另一个文件,即windows快捷方式

bblock

表示块设备和其他外围设备,是特殊类型的文件(/dev

ccharacter

表示字符设备文件(/dev

s socket

表示Socket文件,如:网络通信是产生的包

pnamed pipe

表示管道文件

#####通过ls –l显示文件属性后,第一列的第一个字符就是用来区分文件类型#####

find命令查看文件类型(-type参数)


-type c File is of type c: b block (buffered) special c character (unbuffered) special d directory p named pipe (FIFO) f regular file l symbolic link; s socket D door (Solaris)

3.2 普通文件(按照文件内容分类)

  • 纯文本文件(ASCII text):文件内容可以直接读取到文件数据,例如字母、数字等,可以使用cat命令读取文件,比如配置文件几乎都是纯文本文件
file命令查看文件类型:
[root@oldboy ~]# file Wolf_File 
Wolf_File: ASCII text
  • 二进制文件(binary):linux系统中的命令程序属于这种格式,例如cat命令就是一个二进制文件
file命令查看文件类型:
[root@oldboy ~]# file /bin/cat 
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
  • 数据格式文件(data):有些程序在运行的过程中就会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件;例如:linux在用户登录时,都会将登录信息记录在/var/log/wtmp(last命令的数据库文件)那个文件中,该文件是一个数据文件;通过last命令可以读取,使用cat命令读取会出现乱码;因为它属于一种特殊格式的文件。lastlog(/var/log/lastlog)查看linux系统所有用户的登录情况
file命令查看文件类型:
[root@oldboy ~]# file /var/log/wtmp
/var/log/wtmp: data
[root@oldboy ~]# file /var/log/lastlog
/var/log/lastlog: data

3.3 目录文件(directory)

[root@oldboy ~]# ls -ld oldboy/
drwxr-xr-x 2 root root 4096 Apr 14 20:00 oldboy/

如上文所示,当我们执行ls –ld 目录名时,可以看到第一列内容为drwxr-xr-x,第一个字符带d的文件就表示是目录,目录在linux系统中是比较特殊的文件

创建目录的命令可以用mkdir命令或者cp命令(带-r or –a参数),cp可以把一个目录复制为另一个目录;删除目录用rm –rrmdir(删除空目录)命令

区别目录和文件:

ls –F命令在目录后面加/来区分文件和目录:
[root@oldboy ~]# ls -F
1.py             copied.txt      install.log         stu1/  teacher1/
Wolf_File        copied.txt.     install.log.syslog  stu2/  teacher2/
anaconda-ks.cfg  copied.txt.bak  oldboy/             stu3/
tree命令显示当前目录下所有的文件:
[root@oldboy ~]# tree .      
.
|-- 1.py
|-- Wolf_File
|-- anaconda-ks.cfg
|-- copied.txt
|-- copied.txt.
|-- copied.txt.bak
|-- install.log
|-- install.log.syslog
|-- oldboy
|-- stu1
|-- stu2
|-- stu3
|-- teacher1
|   |-- a
|   `-- b
`-- teacher2
    |-- a
    `-- b

10 directories, 8 files
tree命令只显示当前目录下的目录文件:
[root@oldboy ~]# tree -d .   
.
|-- oldboy
|-- stu1
|-- stu2
|-- stu3
|-- teacher1
|   |-- a
|   `-- b
`-- teacher2
    |-- a
    `-- b

10 directories
tree命令只显示当前目录下一级目录:
[root@oldboy ~]# tree -Ld 1 . 
.
|-- oldboy
|-- stu1
|-- stu2
|-- stu3
|-- teacher1
`-- teacher2

6 directories

3.4 文件类型实例

1)    .tar、.tar.gz、.tgz、.zip、.tar.bz表示压缩文件,创建命令一般为tar,gzip,unzip等
2)    .sh表示shell脚本文件,通过shell语言开发的程序
3)    .pl表示perl语言文件,通过perl语言开发的程序
4)    .py表示python语言文件,通过python语言开发的程序
5)    .html、.htm、.php、.jsp、.do、.asp表示网页语言文件
6)    .conf表示系统配置文件
7)    .rpm表示rpm安装包文件

4 文件权限

4.1 文件权限概述

Linux中每个文件或者目录都有一组共9个基础权限位,每三位字符被分为一组,他们分别是属主权限位(占三个字符)、用户组权限位(占三个字符)、其他用户权限位(占三个字符);比如rwxr-xr-x,在linux中正是这9个字符权限位来控制文件属主、用户组以及其他用户的权限

文件权限示例图

 

文字解释:
r(read)代表读权限,用数字4表示
wwrite)代表写权限,用数字2表示
x(execute)代表执行权限,用数字1表示
-代表没有权限,用数字0表示
前三位:代表文件属主/用户(owner/user)
中三位:代表文件用户组(group)
后三位:代表其他用户(other)
说明:特殊权限位:t T s S x X

4.2 模拟演示环境

4.2.1 用户测试准备

[root@oldboy ~]# groupadd incahome  #一个家庭(oldboy的家)
[root@oldboy home]# useradd -g incahome oldboy  #让家庭住人oldboy属于incahome这个家(模拟user)
[root@oldboy home]# useradd -g incahome oldgril  #incahome这个家的家庭成员(模拟用户组group)
[root@oldboy home]# useradd test   #外面的人,主人及家庭成员以外的人(other)
[root@oldboy home]# id oldboy 
uid=502(oldboy) gid=502(incahome) groups=502(incahome)
[root@oldboy home]# id oldgril
uid=503(oldgril) gid=502(incahome) groups=502(incahome)
[root@oldboy home]# id test   
uid=501(test) gid=501(test) groups=501(test)

如果oldboy用户存在的话就用下面修改用户组的命令进行修改

[root@oldboy home]# usermod -g incahome oldboy

4.2.2 创建文件的测试准备

[root@oldboy ~]# mkdir /oldboy -p
[root@oldboy ~]# echo "echo oldboylinux" > /oldboy/test.sh  
[root@oldboy ~]# chmod +x /oldboy/test.sh 
[root@oldboy ~]# cat /oldboy/test.sh 
echo oldboylinux
[root@oldboy ~]# ls -lh /oldboy/test.sh 
-rwxr-xr-x 1 root root 17 Apr 27 21:14 /oldboy/test.sh

4.2.3 范例:实操体会文件权限

模拟演练环境:

打开四个窗口分别用root、oldboy、oldgril、test用户登录

分别测试oldboy、oldgril、test用户对上述test.sh文件的权限

实操一:

[root@oldboy ~]# ls -lh /oldboy/test.sh 
-rwxr-xr-x 1 root root 17 Apr 27 21:14 /oldboy/test.sh

结论1:

oldboy、oldgril、test三个用户拥有同样的其他用户的权限,即读和执行,没有写的权限

实操二:

[root@oldboy ~]# chown oldboy.incahome /oldboy/test.sh 
[root@oldboy ~]# ls -l /oldboy/test.sh
-rwxr-xr-x 1 oldboy incahome 17 Apr 27 21:14 /oldboy/test.sh

结论2:

oldboy用户拥有对应用户的权限,即读、写和执行的权限
oldgril用户拥有对应用户组(incahome)的权限,即读和执行的权限,没有写的权限
test用户拥有对应其他用户的权限,即读和执行的权限,没有写的权限

实操三:

[root@oldboy ~]# chmod g+w,o-x /oldboy/test.sh 
[root@oldboy ~]# ls -l /oldboy/test.sh
-rwxrwxr-- 1 oldboy incahome 25 Apr 27 21:26 /oldboy/test.sh

总结文件测试结论:linux普通文件的读、写、执行权限说明:

1.    可读r:表示具有读取\阅读文件内容的权限
2.    可写w:表示具有新增、修改文件内容的权限
    如果没有r配合,那么vi编辑文件会提示无法编辑(但可强制编辑),echo可以重定向或追加
    特别提示:删除文件(修改文件名等)的权限是受父目录(即上一级目录)的权限控制,和文件本身(即文件名)权限无关
3.    可执行x:表示具有执行文件的权限
    文件本身要能够执行
    普通用户同时还需要具备r的权限才能执行
    root只要有x的权限就能执行
win32下可执行文件:*.exe,*.bat,*.com
linux下可执行文件:*.sh,*.py,*.perl等

4.2.4 企业面试题:请从linux文件系统的角度详细描述读取/oldboy/test.sh文件的过程

有关文件删除的说明:

Linux中的文件名是存在于父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块。
我们删除一个文件,实际上并不清楚inode节点和block的数据。只是在这个文件的父目录里面的block中,删除这个文件的名字和这个文件inode的对应关系,使这个文件名消失,并且无法指向这个文件的inode节点,
当没有文件名指向这个inode节点的时候,系统会同时释放inode节点和存放这个文件的数据块,并更新inode MAP和block MAP,让这些位置可以用于放置其他新的文件数据。

图一 详细描述读取/oldboy/test.sh文件的流程图

因此,修改和删除文件名都是在操作文件的上级目录的block,修改或删除的是文件名和inode的关联数据,所以删除文件是和上级目录权限关联

范例:实操体会目录权限

开启两个窗口通过两个用户演示上面的权限。一个是root,一个是oldboy用户,一个是oldgril用户,一个是test用户

演示环境准备:

[root@oldboy ~]# mkdir /oldboy/test -p
[root@oldboy ~]# ls -ld /oldboy/test
drwxr-xr-x 2 root root 4096 Apr 27 23:39 /oldboy/test

测试目录的rwx

特别是文件的删除

总结目录测试结论:linux目录的读、写、执行权限说明:

1、可读r:表示具有浏览目录下面文件及子目录的权限,即ls dir
    如果没有x权限,不能进到目录里,即无法(cd dir)
    如果没有x权限,ls列表时可以看到所有文件名,但是会提示无权访问目录下文件
    如果ls -l列表,所有的属性会带有问号,也会提示无权访问目录下文件,但可以看到所有文件名
2、可写w:表示具有增加、删除或修改目录内文件名(一般指文件名)的权限(需要x权限配合)
3、可执行x:表示具有进入目录的权限,例如:cd dir;但是没有r无法列表文件及目录,没有w无法新建和删除

4.3 文件权限更改命令

4.3.1 改变文件权限属性命令chmod

chmod - change file mode bits
[root@oldboy ~]# which chmod 
/bin/chmod

chmod是用来改变文件和目录权限的命令,但只有文件的属主和超级用户root才有这种权限。通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达式的方法来设置权限;另一种是使用数字方法(常用)来设置权限。

4.3.2 chmod数字权限方法(推荐)

命令格式:

chmod [数字组合] 文件名

chmod [数字组合] 目录名 -R参数可递归生效(该目录下所有文件或子目录一起改变)

数字意义说明:

r    4
w    2
x    1
-    0
rwxr-xr-x 755 目录默认权限  rw-r--r--  644文件默认权限 

每个三位的权限代码(分别是属主、属组、其它用户)组合,有8种可能:

八进制                    权限
0                        ---
1                        --x
2                        -w-
3                        -wx
4                        r--
5                        r-x
6                        rw-
7                        rwx

演示实例:

[root@oldboy oldboy]# ls -l test.sh
-rw-r--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]# chmod 665 test.sh 
[root@oldboy oldboy]# ls -l test.sh     
-rw-rw-r-x 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]# chmod 715 test.sh 
[root@oldboy oldboy]# ls -l test.sh     
-rwx--xr-x 1 oldboy incahome 29 Apr 27 21:59 test.sh

4.3.3 chmod字符式权限表示法

命令格式:

Chmod [用户类型] [+ | - | =] [权限字符] 文件名

表一 详细说明表

chmod

用户类型

操作字符

权限字符

文件和目录

Uuser

+(增加)

r

Ggroup

 

-

Oothers

-(减少)

w

Aall

=(设置)

x

文字说明:

+:添加某个权限
-:取消某个权限
=:取消其他所有权限赋予给定的权限

演示实例:

[root@oldboy oldboy]# ls -l test.sh
-rw-r--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]# chmod u+x test.sh  
[root@oldboy oldboy]# ls -l test.sh     
-rwxr--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]# chmod g+w test.sh 
[root@oldboy oldboy]# ls -l test.sh
-rwxrw-r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]# chmod u-x,g-w,o-r test.sh
[root@oldboy oldboy]# ls -l test.sh            
-rw-r----- 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]# chmod a=rw test.sh
[root@oldboy oldboy]# ls -l test.sh     
-rw-rw-rw- 1 oldboy incahome 29 Apr 27 21:59 test.sh
[root@oldboy oldboy]#

4.3.4 Umask默认文件或权限分配命令

创建目录dir与创建文件file实例

[root@oldboy test]# mkdir dir 
[root@oldboy test]# touch file
[root@oldboy test]# ls -lrt
total 4
drwxr-xr-x 2 root root 4096 Apr 29 15:12 dir  ->创建目录默认权限为755
-rw-r--r-- 1 root root    0 Apr 29 15:12 file –>创建文件默认权限为644
说明:root超级用户创建目录默认权限为755,文件默认权限为644

问题:为什么默认权限目录是755,文件是644而不是其他的值呢?

不管是操作系统还是网站站点目录,安全权限的临界点:
1)目录755,文件644是相对安全的权限
2)用户为root,用户组为root
注意:生产工作中一定尽量要文件和目录达到以上默认权限,其用户和属组都是root
Linux系统默认权限的方针:允许浏览、查看,但禁止创建文件、修改文件内容以及执行文件

实际是由/etc/bashrc文件控制:

[root@oldboy ~]# umask
0022 ->root超级用户系统默认的umask值
[root@oldboy ~]# sed -n \'65,69p\' /etc/bashrc
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
fi
umask值为002,举例:
[oldboy@oldboy ~]$ ls -l file1
-rw-rw-r-- 1 oldboy oldboy 0 Apr 29 16:13 file1
[oldboy@oldboy ~]$ id 
uid=502(oldboy) gid=503(oldboy) groups=503(oldboy)
[oldboy@oldboy ~]$ umask
0002
umask值为022,举例:
[oldboy@oldboy ~]$ ls -l file
-rw-r--r-- 1 oldboy incahome 0 Apr 29 16:07 file
[oldboy@oldboy ~]$ id
uid=502(oldboy) gid=502(incahome) groups=502(incahome)
[oldboy@oldboy ~]$ umask
0022

文件权限计算方法:

root用户下默认文件权限计算方法
1)假设umask值为:022(所有位为偶数)
    6 6 6        ==>文件的起始权限值
    0 2 2 –    ==>umask值(采用减法)
    ----------
    6 4 4        ==>创建文件默认权限值
2)假设umask值为:045(所有是奇数的位要加1)
    6 6 6        ==>文件的起始权限值
    0 4 5 –    ==>umask值(采用减法)
    ----------
    6 2 1        ==>计算出来的权限值
    0 0 1 +    ==>由于umask最后一位是5,在其他用户位再加1(采用加法)
    ---------
    6 2 2        ==>真实文件权限(即创建文件默认权限值)

4.3.5 特殊权限位

特殊权限位基本说明:

Linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限
suid        s(有x)    S    4    用户对应的权限位(用户对应的3位上)
sgid        s(有x)    S    2    用户组对应的权限位(用户组对应的3位上)
sticky    t(有x)    T    1    其他用户对应的权限位

如何查找系统(/usr/bin)目录中设置suid的命令

方法一:
[root@oldboy oldboy]# find /usr/bin -type f -perm 4755 | xargs ls -l 
-rwsr-xr-x. 1 0 root 54240 Jan 30  2012 /usr/bin/at
-rwsr-xr-x. 1 0 root 66352 Dec  8  2011 /usr/bin/chage
-rwsr-xr-x. 1 0 root 51784 Nov 23  2013 /usr/bin/crontab
-rwsr-xr-x. 1 0 root 71480 Dec  8  2011 /usr/bin/gpasswd
-rwsr-xr-x. 1 0 root 36144 Dec  8  2011 /usr/bin/newgrp
-rwsr-xr-x. 1 0 root 30768 Feb 22  2012 /usr/bin/passwd
-rwsr-xr-x. 1 0 root 27576 Sep 20  2013 /usr/bin/pkexec
方法二:
[root@oldboy oldboy]# find /usr/bin -type f -perm 4755 -exec ls -l {} \;
取消suid设置命令:
[root@oldboy oldboy]# find /usr/bin -type f -perm 4755 | xargs chmod u-s
[root@oldboy oldboy]# find /usr/bin -type f -perm 4755 -exec chmod u-s {} \;

如何查找系统(/usr/bin)目录中设置sgid的命令

[root@oldboy oldboy]# find /usr/bin -type f -perm 2755 | xargs ls -l 
-rwxr-sr-x. 1 0 nobody 125000 Nov 23  2013 /usr/bin/ssh-agent
-rwxr-sr-x. 1 0 tty     12016 Nov 22  2013 /usr/bin/write

特殊权限对应数字总结:

suid 4000 权限字符s(S),用户位的x位上设置
授权方法:chmod 4755 /bin/rm 或chmod u+s /bin/rm
sgid 2000 权限字符s(S),用户组位的x位上设置
授权方法:chmod 2755 /bin/rm 或chmod g+s /bin/rm
粘滞位1000权限字符t(T),其他用户位的x位上设置
授权方法:chmod 1777 /tmp 或chmod o+t /tmp
如果对应位有x则字符权限表现为小写,否则表现为大写
tmp经典的粘滞位目录案例,特点是谁都有写权限,因此安全成问题。常常是木马第一手跳板地点

特殊权限总结:

1)suid是什么、作用,passwd命令案例,如何设置使用rm案例
2)sgid是什么、作用,文件locate案例。共享目录用户组案例
3)粘滞位是什么、作用,/tmp目录案例
4)以数字及字符方式更改权限,chmod命令
5)更改文件用户和组,chown命令
6)更改用户组,chgrp命令
7)chattr更改文件属性(linux安全优化)
命令格式:
chattr - change file attributes on a Linux file system
chattr [ -RVf ] [ -v version ] [ mode ] files...
The format of a symbolic mode is +-=[acdeijstuADST].
-R参数代表递归改变目录以及目录下面的文件的属性
mode指定模式
+    代表添加属性到已有其他属性的文件中
-    代表从已有属性文件中删除指定的属性
=    代表取消原有的属性设置成指定的属性
i    代表锁定文件使其不可变(linux安全优化常用模式)[immutable 不可变]
a    代表文件只有追加属性(append only)
演示实例:
[root@oldboy ~]# chattr +i /etc/{passwd,shadow,group,gshadow,inittab}  
[root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab}   
----i--------e- /etc/passwd
----i--------e- /etc/shadow
----i--------e- /etc/group
----i--------e- /etc/gshadow
----i--------e- /etc/inittab
[root@oldboy ~]# chattr -i /etc/{passwd,shadow,group,gshadow,inittab}  
[root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab}   
-------------e- /etc/passwd
-------------e- /etc/shadow
-------------e- /etc/group
-------------e- /etc/gshadow
-------------e- /etc/inittab
8)lsattr查看文件属性
命令格式:
lsattr  - list file attributes on a Linux second extended file sys-tem
lsattr [ -RVadv ] [ files...  ]
参数:
-R 代表递归列出目录以及目录下面的文件的属性
-a 代表显示目录中所有文件,包含”.”与”..”隐藏文件
-d 代表只显示目录本身的属性,而不显示目录下包含的文件属性
演示实例:
[root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab}
-------------e- /etc/passwd
-------------e- /etc/shadow
-------------e- /etc/group
-------------e- /etc/gshadow
-------------e- /etc/inittab

4.3.6 chown改变文件所属关系

chown(change owner

当我们要改变一个文件的属主,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户。只有超级用户才能改变文件的属主

chown语法:

chown [选项]…[所有者][:[用户组]] 文件……

模拟环境:

[root@oldboy oldboy]# ls -l test.sh
-rw-rw-rw- 1 oldboy incahome 29 Apr 27 21:59 test.sh

常用的更改方法:

chown 用户 文件或目录 <==仅仅授权用户
演示实例:
[root@oldboy oldboy]# chown oldgril test.sh
[root@oldboy oldboy]# ls -l test.sh        
-rw-rw-rw- 1 oldgril incahome 29 Apr 27 21:59 test.sh
chown :组 文件或目录 <==仅仅授权组 等同于“chgrp 组 文件或目录”
演示实例:
[root@oldboy oldboy]# chown :oldboy test.sh
[root@oldboy oldboy]# ls -l test.sh        
-rw-rw-rw- 1 oldgril oldboy 29 Apr 27 21:59 test.sh
chown 用户:组 文件或目录 <==表示授权用户和组
演示实例:
[root@oldboy oldboy]# chown test:test test.sh
[root@oldboy oldboy]# ls -l test.sh          
-rw-rw-rw- 1 test test 29 Apr 27 21:59 test.sh
chgrp 组 文件或目录
演示实例:
[root@oldboy oldboy]# chgrp incahome test.sh
[root@oldboy oldboy]# ls -l test.sh         
-rw-rw-rw- 1 test incahome 29 Apr 27 21:59 test.sh

强调:

1)其中的冒号”:”可以用点号”.”替代
2)要授权的用户和组名,必须是linux系统中实际存在的

5 软硬链接

5.1 链接概述

  在linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软链接或符号链接(Symbolic Link or Soft Link);使用ln命令就是创建链接文件,在默认不带参数的情况下,执行ln命令创建的链接是硬链接

         如果使用ln –s创建链接则为软链接,前面文件类型为l(字母L)的是软链接

         软硬链接使用语法:

         硬链接:ln 源文件 目标文件

         软链接:ln –s 源文件 目标文件(目标文件事先不能存在)

5.2 硬链接

硬链接是指通过索引节点(Inode)来进行链接。在linux(ext2,ext3,ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode index)简称Inode,即在系统中文件的编号。

在linux文件系统中,多个文件指向同一个索引节点(Inode)是正常允许的。这种情况的文件称为硬链接。提示:硬链接文件就相当于文件的另外一个入口。硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?

因为文件系统(ext2)的原理是只要文件的索引节点(inode)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,在linux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除

硬链接原理图:

硬链接示意图:

 5.3 硬链接总结

1)    具有相同inode节点号的多个文件是互为硬链接文件
2)    删除硬链接文件或者删除源文件任意之一,文件实体并未被删除
3)    只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除
4)    当所有的硬链接文件及源文件被删除后,再存放新的数据就会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及多套环境测试的好习惯)
5)    硬链接文件就是文件的另一个入口(相当于超市的前后门)
6)    可以通过给文件设置硬链接文件,来防止重要文件被误删
7)    通过执行命令“ln 源文件 硬链接文件”,即可完成硬链接的创建
8)    硬链接文件是普通文件,因此可以使用rm命令删除
9)    对于静态文件(没有进程调用的文件)来讲,当对应硬链接数为0(i_link),文件就会被删除。i_link的查看方法(ls –l结果的第三列)

5.4 软链接

  软链接(Soft Link)也称为符号链接(Symbolic link)。Linux里的软链接文件就类似于Windows系统中的快捷方式。Linux里的软链接文件实际上是一个特殊的文件,文件类型为l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体

软链接原理图:

查看软链接的value(源文件)值的方法:

readlink - print value of a symbolic link or canonical file name ##查看软链接value(源文件)
[root@oldboy ~]# ls -ld /application/apache
lrwxrwxrwx 1 root root 25 Mar 15 01:02 /application/apache -> /application/apache2.2.17
[root@oldboy ~]# readlink /application/apache
/application/apache2.2.17
[root@oldboy ~]#

软链接的创建:

         执行命令“ln –s 源文件 软链接文件”,即可完成软链接的创建

误区:创建软链接源文件是需要存在的,要创建的软链接文件是不能事先存在的

5.5 软链接总结

1)       软链接类似windows系统的快捷方式(readlink查看其指向)

2)       软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体

3)       删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容了

4)       失效的时候一般是白字红底闪烁提示soft_link_c -> a

5)       执行命令“ln –s 源文件 软链接文件”,即可完成创建(目标文件不能存在)

6)       软链接和源文件是不同类型的文件,也是不同的文件,inode也不相同

7)       软链接文件的文件类型为(l),是普通文件,可以使用rm命令删除

5.6 示例演示

文件示例(创建软硬链接)

[root@oldboy ~]# mkdir /test/oldboy -p
[root@oldboy ~]# cd /test/oldboy/
[root@oldboy oldboy]# touch oldboyfile #创建一个测试文件oldboyfile
[root@oldboy oldboy]# ln oldboyfile oldboyfile_hard_link #创建硬链接
[root@oldboy oldboy]# ln -s oldboyfile oldboyfile_soft_link #创建软链接
[root@oldboy oldboy]# ls -li 
total 0
142211 -rw-r--r-- 2 root root  0 Apr 16 05:36 oldboyfile
142211 -rw-r--r-- 2 root root  0 Apr 16 05:36 oldboyfile_hard_link
142212 lrwxrwxrwx 1 root root 10 Apr 16 05:37 oldboyfile_soft_link -> oldboyfile
[root@oldboy oldboy]# readlink oldboyfile_soft_link #查看软链接value
oldboyfile

目录示例(软硬链接)

[root@oldboy oldboy]# mkdir oldboydir #创建一个测试文件oldboydir
[root@oldboy oldboy]# ln oldboydir oldboydir_hard_link
ln: `oldboydir\': hard link not allowed for directory
#为什么目录不允许创建硬链接?原因是创建目录硬链接不能够跨文件系统,如果不同的分区上面有相同的inode所以节点导致系统数据存储混乱,故不能创建硬链接(目录)
[root@oldboy oldboy]# ln -s oldboydir oldboydir_soft_link #创建软链接,目录软链接在生产环境经常用到,硬链接用的不多
[root@oldboy oldboy]# ls -litr
total 4
142211 -rw-r--r-- 2 root root    0 Apr 16 05:36 oldboyfile_hard_link
142211 -rw-r--r-- 2 root root    0 Apr 16 05:36 oldboyfile
142212 lrwxrwxrwx 1 root root   10 Apr 16 05:37 oldboyfile_soft_link -> oldboyfile
142215 drwxr-xr-x 2 root root 4096 Apr 16 05:43 oldboydir
142216 lrwxrwxrwx 1 root root    9 Apr 16 05:44 oldboydir_soft_link -> oldboydir

删除实例(软硬链接)

[root@oldboy oldboy]# echo "this is oldboyfile" >> oldboyfile #往创建的测试文件源文件
[root@oldboy oldboy]# cat oldboyfile
this is oldboyfile
[root@oldboy oldboy]# cat oldboyfile_hard_link 
this is oldboyfile
[root@oldboy oldboy]# cat oldboyfile_soft_link 
this is oldboyfile
[root@oldboy oldboy]#
结论:往源文件oldboyfile里写入内容后,它的软硬链接文件同样都有相同的内容

通过以上测试,我们可以得出以下几个结论:

  • 删除软链接文件,对源文件和硬链接文件无任何影响
  • 删除硬链接文件,对源文件和软链接文件无任何影响
  • 删除源文件,对硬链接文件没有影响,但是会导致软链接文件失效,白字红底闪烁
  • 同时删除源文件和硬链接文件,整个文件会真正的被删除
  • 源文件和硬链接文件具有相同的索引节点号(inode),可以认为是同一个文件或一个文件的多个入口
  • 源文件和软链接文件索引节点号(inode)不同,是不同的文件,软链接相当于源文件的快捷方式,包含源文件的位置指向

5.7 目录链接总结

1)    对于目录,是不可以创建硬链接,但可以创建软链接
2)    对于目录的软链接是生产环境运维中常用的技巧
3)    目录的硬链接是不能跨文件系统的(从硬链接的原理方面理解)
4)    每个目录下面都有一个硬链接“.”号和对应上级目录的硬链接“..”
5)    在父目录里创建一个子目录,父目录的链接数增加1(子目录里都有“..”来指向父目录)但是再在父目录里创建文件,父目录的链接数是不会增加了

请问下面的目录(oldboy)的链接数为什么为3?

[root@oldboy oldboy]# ls -lid ../oldboy/ -a
410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/
原因如下:(oldboy目录本身,oldboy目录下的“.”,oldboy目录下test子目录的“..”)
[root@oldboy oldboy]# ls -lid ../oldboy/
410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/
[root@oldboy oldboy]# ls -lid ../oldboy/.
410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/.
[root@oldboy oldboy]# ls -lid ../oldboy/test/..
410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/test/..
[root@oldboy oldboy]#

6 Linux系统用户角色和组

6.1 用户角色划分介绍

首先,我们先说明Linux系统是一个多用户、多任务的操作系统。在linux系统中,由于角色的不同,权限和所完成的任务也是不同的;对于linux系统来说,用户的角色是通过UID和GID识别的:特别是UID,在linux系统运维工作中,一个UID是唯一标识一个系统的用户账号(相当于我们的身份证),linux系统仅能够识别的是UID和GID这样的数字。

用户的UID就相当于我们的身份证一样,用户名就相当于我们的名字。

UID(User Identify)中文用户ID,相当于各位的身份证,在系统中是唯一的

GID(Group Identify)中文用户组ID,相当于各位的家庭或者学校ID

Linux系统中用户角色划分为:超级用户(root)、普通用户(自建的用户,UID在500之后,如日常ssh远程登录管理linux操作系统)、虚拟用户(供系统服务进程调用的,如ngnix、apache、ntp等)

有关UID限制说明类比表

UID整数范围

UID用户角色

具备UID用户特性

0

超级用户(root皇帝)

当用户的UID为0时,表示这个账号为超级管理员账号,如果要增加一个系统管理员账号的话,只需将该账号的UID改成0即可。生产环境不建议这么做,使用sudo替代即可。

1-499

虚拟用户(傀儡)

这个范围是保留给系统使用的UID,之所以这样划分,是为了防止人为简历账户的UID和系统的UID之间冲突。并没有其他特殊的含义。在/etc/passwd文件中的虚拟用户的UID都会在这个范围内。除了0之外,所有的UID在使用上没有任何区别。安装系统后默认就会存在,且默认情况大多数不能登录系统shell为/sbin/nologin

满足条件:每个文件和进程,都需要对应一个用户和用户组

500-65535

普通用户(百姓)

普通账户UID,当使用useradd gandalf建立账户时,默认情况下UID就是从500开始的。当然,我们也可以指定UID来创建或修改账户的UID

6.2 用户和组的对应关系

用户和组的对应关系有:一对一、一对多、多对一和多对多,方便理解,我们通过图形的方式来展示这种对应关系

文字说明:

1)    一对一:即一个用户可以存在一个组中,也可以是组中唯一的成员。如:root
2)    一对多:即一个用户可以存在于多个用户组中。比如,上图中普通用户oldboy可以是sa组成员,也可以是java用户组成员,还可以是tech用户组成员,这里的oldboy用户具有sa、java、tech多个组的共同权限
3)    多对一:即多个用户可以存在于一个组中,这些用户具有和组相同的权限
4)    多对多:即多个用户可以存在多个组中,并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展

6.3 用户和用户组涉及配置文件说明

新用户创建涉及到四个配置文件包括:/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow,每创建一个新用户都会向这四个配置文件中追加一行用户内容信息

用户/etc/passwd配置文件7列说明:

root

:x

:0

:0

:root

:/root

:/bin/bash

账户名称

:账户密码

:账户UID

:账号组GID

:用户说明

:用户家目录

:shell解释器

用户密码/etc/shadow配置文件说明:

小结论

    useradd创建用户会更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow
    passwd设置用户密码会更改/etc/shadow

用户组/etc/group配置文件说明

字段名称

注释说明

用户组名

该组的名称

用户组密码

通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为“x”,类似用户密码被记录在/etc/shadow

GID

用户组ID

用户组成员

加入这个组的所有用户账号

[root@oldboy ~]# grep "wheel" /etc/group

wheel:x:10:gandalf