隐藏权限lsattr、chattr
当你是该文件的拥有者、所有组、权限也有读写权限,但是无法编辑它,那么就要考虑它是否有隐藏权限;
lsattr命令
检查文件隐藏权限 -R:连同子目录的数据一同列出 -a:类似于ls的-a选项,即连同隐藏文件一同列出 lsattr 文件名
[root@jinkai01 ~]# lsattr /etc/passwd ---------------- /etc/passwd
chattr命令
- A:增加该属性后,表示文件或目录的atime将不可修改。
- s:增加该属性后,会将数据同步写入磁盘中。
- a:增加该属性后,表示只能追加不能删除,非root用户不能设定该属性。
- c:增加该属性后,表示自动压缩该文件,读取时会自动解压。
- i:增加该属性后,表示文件不能删除、重命名、设定链接、写入以及新增数据。
修改异常权限 chattr +i 文件名 不容许操作(无法保存)
[root@jinkai01 ~]# lsattr a.txt ---------------- a.txt [root@jinkai01 ~]# chattr +i a.txt [root@jinkai01 ~]# lsattr a.txt ----i----------- a.txt [root@jinkai01 ~]# rm -f a.txt rm: 无法删除"a.txt": 不允许的操作 [root@jinkai01 ~]# mv a.txt b.txt mv: 无法将"a.txt" 移动至"b.txt": 不允许的操作
chattr -i 文件名 取消i 属性
[root@jinkai01 ~]# chattr -i a.txt [root@jinkai01 ~]# lsattr a.txt ---------------- a.txt [root@jinkai01 ~]# rm -f a.txt 删除成功
chattr +a 文件名 只能在文件尾追加文字,不能修改,不能删除,不能改名字
[root@jinkai01 ~]# chattr +a a.txt [root@jinkai01 ~]# lsattr a.txt -----a---------- a.txt [root@jinkai01 ~]# rm a.txt rm:是否删除普通空文件 "a.txt"?y rm: 无法删除"a.txt": 不允许的操作 [root@jinkai01 ~]# echo fdsafdsfsda > a.txt -bash: a.txt: 不允许的操作 [root@jinkai01 ~]# echo fdsafdsfsda >> a.txt [root@jinkai01 ~]# cat a.txt fdsafdsfsda
特殊权限
set_uid
该权限针对二进制可执行文件,使文件在执行阶段具有文件所有者的权限。 比如:passwd这个命令就具有该权限。当普通用户执行passwd命令时,可以临时获得root权限,从而可以更改密码。 当我们查询/usr/bin/passwd的权限的时候会发现,出现了一个s权限,这个s权限就是我们所讲述的;
[root@jinkai01 ~]# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
由于每个用户都需要使用passwd命令来修改密码,那么就需要所有用户都拥有这个文件的权限,也就是(所有者); 而这个文件的所有者却是ROOT账号与root组;此时我们就会使用一个特殊权限来赋予它,也就是s权限; set_uid命令:可以使普通用户临时赋予root权限,但是对象必须是可执行的二进制文件;
[root@jinkai01 ~]# su - user1 上一次登录:一 8月 3 14:38:14 CST 2020pts/0 上 [user1@jinkai01 ~]$ whoami user1 [user1@jinkai01 ~]$ ls /root/ ls: 无法打开目录/root/: 权限不够 [user1@jinkai01 ~]$ ls -ld /root/ dr-xr-x---. 4 root root 221 8月 3 15:54 /root/
此时我们会发现/root/目录的权限所有者为root,其他用户user1根本无法操作; 那么我们就需要使用root账号给ls命令赋予s权限: chmod u+s [路径]
root@jinkai01 ~]# chmod u+s /usr/bin/ls [root@jinkai01 ~]# ls -l /usr/bin/ls -rwsr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls
再在user1账号下ls下/root/目录,我们会发现可以查看/root/目录了;
[user1@jinkai01 ~]$ ls /root/ 1 2 abc anaconda-ks.cfg a.txt
取消s权限: 格式: chmod u-s [路径]
[root@jinkai01 ~]# chmod u-s /usr/bin/ls [root@jinkai01 ~]# ls -l /usr/bin/ls -rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls
set_gid
该权限可以作用在文件上(二进制可执行文件),也可以作用在目录上。当作用在 文件上时,其功能和set uid一样,它会使文件在执行阶段具有文件所属组的权限。目录被设 置这个权限后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组,使其临时具备所有组的权限 首先查看权限,普通用户无法ls /root/目录下的文件;
[root@jinkai01 ~]# ls -l /usr/bin/ls -rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls [root@jinkai01 ~]# su - user1 上一次登录:一 8月 3 16:00:35 CST 2020pts/0 上 [user1@jinkai01 ~]$ ls /root/ ls: 无法打开目录/root/: 权限不够
我们通过root账号赋予ls命令拥有所属组来查看 chmod g+s [路径]
[root@jinkai01 ~]# chmod g+s /usr/bin/ls [root@jinkai01 ~]# ls -ld /usr/bin/ls -rwxr-sr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls
再切换到普通用户user01来ls /root/看看
[root@jinkai01 ~]# su - user1 上一次登录:一 8月 3 16:05:30 CST 2020pts/0 上 [user1@jinkai01 ~]$ ls /root/ 1 2 abc anaconda-ks.cfg a.txt
取消权限(在root下取消) chmod g-s [路径]
[root@jinkai01 ~]# chmod g-s /usr/bin/ls [root@jinkai01 ~]# ls -ld /usr/bin/ls -rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls
切换到普通用户下查看:
[root@jinkai01 ~]# su - user1 上一次登录:一 8月 3 16:06:49 CST 2020pts/0 上 [user1@jinkai01 ~]$ ls /root/ ls: 无法打开目录/root/: 权限不够
stick_bit
可以理解为防删除位。文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能删除,同时也不能添加新的文件。如果希望用户能够添加文件但不能删除该目录下其他用户的文件, 则可以对父目录增加该权限。设置该权限后,就算用户对目录具有写权限,也不能删除其他用户的文件。 防止其他用户删除文件;/tmp/ 下可被其他用户编辑,无法删除其他用户的文件; 使用普通用户user1在/tmp/下创建一个文件,给文件777权限;
[user1@jinkai01 tmp]$ touch 1.txt [user1@jinkai01 tmp]$ chmod 777 1.txt [user1@jinkai01 tmp]$ ls -l 1.txt -rwxrwxrwx 1 user1 user1 0 8月 3 16:14 1.txt
切换到普通用户user2,此时我们发现可以user2可以编辑1.txt文件,但是无法删除1.txt;
[user1@jinkai01 tmp]$ su - user2 密码: 上一次登录:一 8月 3 14:33:30 CST 2020pts/0 上 [user2@jinkai01 ~]$ echo 1221121 > /tmp/1.txt [user2@jinkai01 ~]$ echo 1221121 >> /tmp/1.txt [user2@jinkai01 ~]$ cd /tmp/ [user2@jinkai01 tmp]$ rm 1.txt rm: 无法删除"1.txt": 不允许的操作
设置权限:chmod o+t /tmp 取消权限:chmod o-t /tmp
软链接
软链接:与硬链接不同,软链接是建立一个独立的文件,当读取这个链接文件时,它会把读取的行为转发到该文件所链接的文件上。例如,现在有一个文件a,我们做了一个软链接文件 b(只是一个链接文件,非常小),b指向了a。当读取b时,b就会把读取的动作转发到a上,这样就读取了文件a。当我们删除文件a时,链接文件b不会被删除;但如果再次读取b时,会提示无法打开文件。然而,当我们删除b时,a是不会有任何影响的。 相当于Windows中的快捷方式; 例如/bin 实际是/usr/bin /bin -> usr/bin 这一行代表的是软链接(快捷方式)
[root@jinkai01 ~]# ls -l /bin lrwxrwxrwx. 1 root root 7 3月 24 17:32 /bin -> usr/bin
创建软链接 格式: ln -s [源文件目录] [软链接文件目录(快捷方式)] 例如:ln -s /usr/bin /bin 在当前目录创建一个软链接(快捷方式),源文件在/root/abc/1.txt
[root@jinkai01 ~]# ln -s /root/abc/1.txt ./1.txt [root@jinkai01 ~]# ls -l 总用量 12 lrwxrwxrwx 1 root root 15 8月 3 16:20 1.txt -> /root/abc/1.txt
删除源 软链接就会error
[root@jinkai01 abc]# rm -f 1.txt [root@jinkai01 abc]# cd .. [root@jinkai01 ~]# ls -l 总用量 12 lrwxrwxrwx 1 root root 15 8月 3 16:20 1.txt -> /root/abc/1.txt
- 注意:创建软链接时尽量使用绝对路径
硬链接
硬链接:当系统要读取一个文件时,会先读inode信息,然后再根据inode中的信息到块区域将数据取出来。而硬链接是直接再建立一个inode链接到文件放置的块区域,即进行硬链接时该文件内容没有任何变化,只是增加了一个指向这个文件的inode,并不会额外占用磁盘空间。硬链接有两个限制: (1)不能跨文件系统,因为不同的文件系统有不同的inode table; (2) 不能链接目录。 复制文件,两个文件相互为硬链接,不管源与目的;删除源不受影响 不允许将硬链接指向目录 不能跨分区做硬链接;比如/boot下 无法做到/下
创建硬链接
格式: ln [源文件路径][硬链接文件]
[root@jinkai01 ~]# ln a.txt aa.txt [root@jinkai01 ~]# ls -l -rw-r--r-- 2 root root 12 8月 3 15:55 aa.txt -rw-r--r-- 2 root root 12 8月 3 15:55 a.txt
实验:我们编辑a.txt文件,然后查看aa.txt文件会发现,a.txt的内容会同步到aa.txt文件里面 实验前:
[root@jinkai01 ~]# cat a.txt 11111111 22222222222222 333333333333333333 [root@jinkai01 ~]# cat aa.txt 11111111 22222222222222 333333333333333333
追加字符串4444444444到a.txt中
[root@jinkai01 ~]# echo 444444444 >> a.txt
查询a.txt文件与aa.txt文件内容
[root@jinkai01 ~]# cat a.txt 11111111 22222222222222 333333333333333333 444444444 [root@jinkai01 ~]# cat aa.txt 11111111 22222222222222 333333333333333333 444444444
- 硬链接的主要是存储在ilod号上; **ls -i ** 查询ilod号发现:a.txt的ilod号与aa.txt的ilod号都是一个1683236 ;
[root@jinkai01 ~]# ls -i 16832369 1.txt 16832368 aa.txt 16797762 anaconda-ks.cfg 16831353 2 21175 abc 16832368 a.txt