一、理解文件
在Linux中,一切皆文件,所有设备、目录和文件都被视为文件,并可以通过文件操作进行访问和管理。
文件是操作系统用来存储信息的基本结构,是一组信息的集合。文件通过文件名来唯一地标识。Linux中的文件名称最长可允许255个字符,这些字符可用AZ、09、.、_、-等符号来表示,并且Linux文件名区分大小写。与其他操作系统相比,Linux没有“扩展名”的概念,也就是说文件的名称和该文件的种类并没有直接的关联。
使用ls -l查看文件的详细信息,一共有7列。
- 第1组表示文件类型及权限
每一行的第一个字符一般用来区分文件的类型。
- -:普通文件
- d:目录
- l: 表示该文件是一个符号链接文件,实际上它指向另一个文件
- b:块设备文件 c:字符设备文件
是操作系统与设备提供连接的一种文件。在Linux系统中将设备作为文件来处理,操作设备就像是操作普通文件一 样。每一个设备对应一个设备文件,存放在 /dev 目录中。 - p:管道文件,主要用于在进程间传递数据
- s:套接字文件,主要用于不同计算机间网络通信
第2~10个字符表示文件的权限:
- 2~4:文件所有者User的读、写、执行权限;
- 5~7:文件所属组用户Group的读、写、执行权限;
- 8~10:其他用户Others的读、写、执行权限。
特别注意,针对文件和目录的读、写、执行具有不同的含义。
文件 | 目录 | |
---|---|---|
r | 具有读取文件内容权限 | 具有浏览目录的权限 |
w | 具有新增、修改文件内容的权限 | 具有删除、移动目录内文件的权限 |
x | 具有执行文件的权限 | 具有进入目录的权限 |
- | 不具有该项权限 | 不具有该项权限 |
-
第2组表示有多少文件名连接到此节点(inode)
每个文件都会将其权限与属性记录到文件系统的i-node中,这个属性记录的就是有多少不同的文件名连接到相同的一个i-node。例如,“2”指该文件的硬链接数(或者说有2个文件名指向这个i-node) -
第3组表示该文件的所属用户
-
第4组表示该文件的所属组群
-
第5组表示该文件的容量大小,单位默认为bytes
-
第6组表示该文件的创建日期或最近的修改日期
-
第7组表示该文件的名称
二、管理Linux文件权限
1. chmod命令修改文件、目录的权限信息
chmod [-R] 权限 文件或目录
-R:对目录内的全部内容应用同样的操作
只有文件、目录的所属用户或root用户才可以修改。
表示权限类型的方法:数字表示法和文字表示法。
- 数字表示法
将读(r)、写(w)和执行(x)分别用数字4、2、1来表示,没有对应位权限则为0,然后把所授予的权限相加而成。
[root@RHEL7-1 ~]# touch /etc/file
[root@RHEL7-1 ~]# chmod 664 /etc/file
[root@RHEL7-1 ~]# ll /etc/file
-rw-rw-r--. 1 root root 0 5月 20 23:15 /etc/file
- 文字表示法
使用4种字母表示不同的用户:
(1)u:user,所有者
(2)g:group,所属组群
(3)o:others,其他用户
(4)a:all,以上3种用户
使用3种字符的组合表示设置操作权限:
(1)r:read,可读
(2)w:write,可写
(3)x:execute,可执行
操作符号:
(1)+:添加某种权限
(2)-:减去某种权限
(3)=:赋予给定权限并取消原来的权限
[root@RHEL7-1 ~]# chmod a+w .bashrc
[root@RHEL7-1 ~]# ls -al .bashrc
-rwxrwxrwx 1 root root 395 Jul 4 11:45.bashrc
2. chown命令修改文件、目录的所属用户和所属组群
chown [-R] [用户]:[用户组] 文件或目录
-R:对目录内全部内容应用同样的操作
普通用户无法修改所属为其他用户或组,该命令只适用于root用户执行。
示例:
chown root hello.txt
将hello.txt所属用户修改为root
chown :root hello.txt
将hello.txt所属用户组修改为root
chown root:test hello.txt
将hello.txt所属用户修改为root,用户组修改为test
chown -R root test
将文件夹test的所属用户修改为root并对文件夹内全部内容应用同样规则
3. chgrp命令修改文件、目录的所属组
chgrp [-R] 用户组 文件或目录
[root@RHEL7-1 ~]# chgrp root test.txt
[root@RHEL7-1 ~]#ls –al
-rwxrwxrwx 1 user1 root 551 5月 23 12:02 test.txt
三、默认权限umask
默认权限:用户在建立文件或目录时的默认权限值。
查看默认权限的方式:
(1)输入umask,可以看到数字形态的权限设定;
(2)加入-S选项,以符号类型的方式显示权限。
设置默认权限:
umask 权限
预设权限:对于文件为666(一般文件的建立是不具备执行的权限),目录为777。
创建文件或目录时的权限计算:预设权限-默认权限。
建立文件时:(-rw-rw-rw-) -(-----w–w-)=-rw-r–r–。
建立目录时:(drwxrwxrwx) -(d----w–w-)=drwxr-xr-x。
umask为003,所以去掉的权限为- - - - - - - -wx,因此相关权限如下。
文件:(-rw-rw-rw-) -(--------wx)=-rw-rw-r–。
目录:(drwxrwxrwx) -(d-------wx)=drwxrwxr–。
四、文件隐藏属性
1. chattr命令
改变文件属性
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录…]
-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-V:显示指令执行过程。
a:系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。
i:不得任意改动文件或目录。
-v<版本编号>:设置文件或目录版本。
+<属性>:开启文件或目录的该项属性。
-<属性>:关闭文件或目录的该项属性。
=<属性>:指定文件或目录的该项属性。
例:请尝试在/tmp目录下建立文件,加入i参数,并尝试删除。
[root@RHEL7-1 ~]# cd /tmp
[root@RHEL7-1 tmp]# touch attrtest <==建立一个空文件
[root@RHEL7-1 tmp]# chattr +i attrtest <==给予i属性
[root@RHEL7-1 tmp]# rm attrtest <==尝试删除,查看结果
rm:remove write-protected regular empty file `attrtest'?y
rm:cannot remove `attrtest':Operation not permitted <==操作不允许
# 连root也没有办法将这个文件删除!需要解除设定
2. lsattr命令
显示文件隐藏属性
lsattr [-adR] 文件或目录
-a:将隐藏文件的属性也显示出来。
-d:如果是目录,仅列出目录本身的属性而非目录内的文件名。
-R:连同子目录的数据也一并列出来。
五、特殊权限
1.SetUID
对于/etc/shadow,普通用户是没有权限修改的,但是当普通用户去使用passwd设置口令的时候,该文件中的相应字段会改变,这是因为当用户执行passwd命令(二进制文件为/usr/bin/passwd,它具有SUID)时,临时拥有了SetUID权限,临时获得了root身份,以root身份去执行,是可以读取和修改/etc/shadow文件的。
SetUID的基本原理:
- Suid通过S字符标识,存在于用户权限位的x权限对应位置
- 如果某文件,用户权限位本身有x权限,给该文件设置suid权限时,则以小写s标识,否则就是大写的S字符。
- 给文件设置s权限对应的数字表示法是4,八进制数下可以用4000 Suid同样也用chmod设置权限,可以以字符法、数字法两种标识。
- SUID特殊权限仅适用于可执行文件(二进制命令,比如/user/bin下提供的命令,/usr/bin/ls /usr/bin/rm)
- 只要用户对SUID的文件有执行权限,那么当用户执行此文件时,会以文件属主的身份去执行此文件
- SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
设定SetUID的方法
- chmod 4755 文件名
- chmod u+s 文件名
取消SetUID的方法
- chmod 755 文件名
- chmod u-s 文件名
2.SetGID
对于二进制命令来说,sgid的功能和suid基本一样,只不过suid是设置文件属主的x权限,sgid是设置属组的x权限。
SetGID对文件的作用:
- 只有可执行的二进制程序才能设置SGID权限
- 命令执行者要对该程序拥有x(执行)权限
- 命令执行在执行程序的时候,组身份升级为该程序文件的属组
- SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
SetGID对目录的作用:
- 为某个目录设置sgid后,在该目录中创建的文件,都以目录的属组权限为准,而不属于创建该文件的用户权限。
- 实现多个用户,可以共享一个目录的作用。
- sgid主要用于目录
设定SetGID的方法
- chmod 2755 文件名
- chmod g+s 文件名
取消SetGID的方法
- chmod 755 文件名
- chmod g-s 文件名
例:创建一个共享目录/home/admins,要求该目录属组是adminuser, adminuser组内成员对该目录的权限是可读可写可执行,其他用户均无任何权限。进入/home/admins创建的文件,自动继承adminuser组的权限。
3.Sticky BIT
SBIT粘着位或粘滞位(Stickybit)作用
- 粘着位目前只对目录有效
- 出现在其他用户权限位x
- 普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
- 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件(目录777权限)。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
设定粘着位的方法
- chmod 1755 文件名
- chmod o+t 文件名
取消粘着位的方法
- chmod 755 文件名
- chmod o-t 文件名
例:root用户创建/home/sbit,权限为777,zhangsan用户在/home/sbit下创建文件zhangsan.txt,lisi用户在/home/sbit下创建文件lisi.txt。分别在zhangsan用户下删除lisi.txt,在lisi用户下删除zhangsan.txt,观察结果?如果都删除了,如何避免删除其他用户的文件。
三种特殊权限总结:
类别 | SUID | SGID | SBIT |
---|---|---|---|
字符表示 | S | S | T |
出现位置 | 用户权限位x | 用户组权限位x | 其他用户权限位x |
基本权限位x | s | s | t |
数字表示法 | 4 | 2 | 1 |
八进制表示法 | 4000 | 2000 | 1000 |
生效对象 | 用户位 | 用户组 | 其他用户 |
利用chmod命令修改文件的特殊权限
# 同时具备SUID和SGID
[root@RHEL7-1 ~]# chmod 6664 /etc/file
[root@RHEL7-1 ~]# ll /etc/file
-rwSrwSr-- 1 root root 22 11-27 11:42 file