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

mac2022-06-30  67

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

转载于:https://www.cnblogs.com/Wolf-Dreams/p/10692835.html

最新回复(0)