linux文件与目录

Posted 烟头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文件与目录相关的知识,希望对你有一定的参考价值。

1.0隐藏权限lsattr_chattr

chattr隐藏权限

man chattr 查看用法

语法:chattr[+-=][Asaci][文件或者目录]

[root@linux1 ~]# chattr --help
Usage: chattr [-RVf] [-+=aAcCdDeijsStTu] [-v version] files...
   -R 递归处理,将指定目录下的所有文件及子目录一并处理。

  -v<版本编号> 设置文件或目录版本。

  -V 显示指令执行过程。

  +<属性> 开启文件或目录的该项属性。

  -<属性> 关闭文件或目录的该项属性。

  =<属性> 指定文件或目录的该项属性。
  • 演示
[root@linux1 ~]# chattr +i 1.txt 
[root@linux1 ~]# vi 1.txt 
  • 提示文件权限不够
[root@linux1 ~]# head -n2 /etc/passwd > 1.txt 
-bash: 1.txt: 权限不够
  • 查看权限是777怎么没权限呢?
[root@linux1 ~]# ls -l 1.txt 
-rwxrwxrwx. 1 centos centos 0 8月  29 11:26 1.txt
  • 这时候考虑有没有隐藏权限

lsattr查看隐藏权限

[root@linux1 ~]# lsattr 1.txt 
----i----------- 1.txt

注:正常情况下新建一个文件是没有隐藏权限的,加了i权限之后不能mv(重命名,移动)rm(删除)vi(编辑)touch(更改时间)>(覆盖)

去掉 i权限

[root@linux1 ~]# chattr -i 1.txt 

chattr +a 1.txt只能追加 不允许其他操作

[root@linux1 ~]# chattr +a 1.txt 
[root@linux1 ~]# mv 1.txt 2.txt
mv: 无法将"1.txt" 移动至"2.txt": 不允许的操作
[root@linux1 ~]# rm 1.txt 
rm:是否删除普通空文件 "1.txt"?y
rm: 无法删除"1.txt": 不允许的操作
[root@linux1 ~]# head -n2 /etc/passwd > 1.txt 
-bash: 1.txt: 不允许的操作
[root@linux1 ~]# head -n2 /etc/passwd >> 1.txt 
[root@linux1 ~]# cat 1.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

可以看的出赋予1.txt a隐藏权限。允许追加,类似日志,还允许touch(更改时间)不允许其他操作

如何全掉a权限?

[root@linux1 ~]# chattr -a 1.txt

2.特殊权限set_uid

概述:

1.set_uid 只能作用于二进制可执行文件,对普通文本文件无效
2.普通用户执行拥有该权限的二进制文件时,可以使普通用户临时拥有root权限(例如:更改密码的命令 /usr/bin/passwd 对除 root 以外的用户不可读、不可写和不可执行,但是普通用户同样可以使用该命令更改自己的密码)
技术图片

  • s 就是set_uid的权限
  • 代表普通用户临时拥有root权限
  • 是二进制文件,是一个可执行的文件
  • 当普通用户执行这种类型的文件,临时拥有所属者的权限

如何给文件赋予set_uid权限

[root@linux1 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls
[root@linux1 ~]# chmod u+s /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

赋予set_uid权限是让普通用户拥有所有者身份(临时拥有root权限)

测试用普通用户登录系统

[root@linux1 ~]# su - centos
[centos@linux1 ~]$ ls -l
总用量 0
[centos@linux1 ~]$ ls -l /root/
总用量 24
drwxrwxrwx. 2 centos centos    32 8月  29 11:44 123
-rwxrwxrwx. 1 centos centos    65 8月  30 12:26 1.txt
-rw-rw-r--. 1 root   root       0 8月  29 12:07 3.txt
-rw-------. 1 root   root    1177 8月  27 00:40 anaconda-ks.cfg

如何给文件全掉set_uid权限

[root@linux1 ~]# chmod u-s /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwxr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

再用普通用户执行命令

[centos@linux1 ~]$ ls -l /root/
ls: 无法打开目录/root/: 权限不够

另外一种方法赋予set_uid权限

[root@linux1 ~]# chmod u=rws /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwSr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

这时候看到权限是rwS,是因为没有x可执行权限。但是不影响,普通用户还是可以执行,可以赋予x可执行权限就会S变s

[root@linux1 ~]# chmod u+x /usr/bin/ls
[root@linux1 ~]# ls -l /usr/bin/ls
-rwsr-xr-x. 1 root root 117680 10月 31 2018 /usr/bin/ls

没有x权限也可以直接执行?

s也有执行权限,所以可以直接执行、ls命令普通用户权限本来就可以执行

目录也可以加s权限,但是没有意义

3.特殊权限set_gid

概况:

可以应用在文件上同样可以作用在目录。设置文件上和set_uid类似,前提两个文件是可以执行的二进制文件,设置set_gid,执行文件的用户临时以该文件所属组的身份执行。要是目录被设置这个权限,在此目录下创建文件或者目录与子目录和该目录的所属组相同。

set_gid作用在组权限位上

技术图片

s权限意味着,除了这个文件的所属组之外。其他用户在执行命令一瞬间拥有所属组的权限

[root@linux1 ~]# ls -ld /root/
dr-xr-x---. 4 root root 227 8月  30 12:25 /root/

root所属组权限位r-x,可读可执行,所以普通用户拥有set_gid权限,所以可以使用root所属组权限可以查看root目录文件

[root@linux1 ~]# su - centos
[centos@linux1 ~]$ ls -l /root/
总用量 24
drwxrwxrwx. 2 centos centos    32 8月  29 11:44 123
-rwxrwxrwx. 1 centos centos    65 8月  30 12:26 1.txt
-rw-rw-r--. 1 root   root       0 8月  29 12:07 3.txt
-rw-------. 1 root   root    1177 8月  27 00:40 anaconda-ks.cfg

没有所属组权限没有set_gid权限,会提示权限不够

[root@linux1 ~]# chmod g-s /usr/bin/ls //root用户先减set_gid权限

[centos@linux1 ~]$ ls -l /root/ //普通用户执行
ls: 无法打开目录/root/: 权限不够

set_gid权限可以作用在目录上。给123目录赋予s权限

[root@linux1 ~]# chmod g+s 123/

查看权限

[root@linux1 ~]# ls -ld 123
drwxrwsrwx. 2 centos centos 32 8月  29 11:44 123

更改用户组

[root@linux1 ~]# chown root:centos 123
[root@linux1 ~]# ls -ld 123
drwxrwsrwx. 2 root centos 32 8月  29 11:44 123

在123目录下创建一个文件

[root@linux1 ~]# touch 123/3.txt
[root@linux1 ~]# ls -ld 123/3.txt 
-rw-r--r--. 1 root centos 0 8月  30 13:15 123/3.txt

新建文件所属组也是centos

注:当给目录set_gid权限时,它下面创建子目录和文件都会跟着父级目录。

4.0特殊权限stick_bit

系统中的/tmp/目录是拥有stick_bit权限的

[root@linux1 ~]# ls -ld /tmp/
drwxrwxrwt. 21 root root 4096 8月  29 19:04 /tmp/
  • 注:它的权限位在其他用户上,防删除位,防止别人删除自己的文件,root用户除外

普通用户(centos这是用户)在tmp创建一个文件

[centos@linux1 tmp]$ touch 1.txt

用centos1用户去删除centos用户的文件

[centos1@linux1 tmp]$ rm 1.txt 
rm:是否删除有写保护的普通空文件 "1.txt"?y
rm: 无法删除"1.txt": 不允许的操作

增加stick_bit放删除位

chmod o+t 目录

总结:

1.这drwxrwxrwt.里面的t(t里面包含x权限),就是stick_bit权限,stick_bit(t):又叫做防删除位。

2.只对目录有效,对文件无效。

3.在/tmp/下有很多类似的文件,拥有777权限,说明任何一个用户都可对这个目录可写,并创建自己的文件

5.0软连接

软连接
命令:  ln -s 原文件 目标文件
特征:
1.相当于windows的快捷方式
2.只是一个符号连接,所以软连接文件大小都很小
3.当运行软连接的时候,会根据连接指向找到真正的文件,然后执行
4.所有软连接文件的权限是777,而真正的权限是由指向的那个文件决定的
5.原文件丢失,软连接无法访问,会报找不到的错误
6.ls -al以后,软连接后面箭头指向的是原文件

/bin相当于/usr/bin的快捷方式

[root@linux1 ~]# ls -l /bin
lrwxrwxrwx. 1 root root 7 8月  27 00:34 /bin -> usr/bin

链接文件的大小和路径有关,路径越长,文件越大。

如何创建软连接

ls -s 源文件 创建软连接文件

[root@linux1 ~]# tree 123
123
├── 1.txt
├── 234
│   └── 1.txt
├── 2.txt
└── 3.txt

创建软连接

[root@linux1 ~]# ln -s /root/123/2.txt /root/123/234/2.txt 
[root@linux1 ~]# tree 123
123
├── 1.txt
├── 234
│   ├── 1.txt
│   └── 2.txt -> /root/123/2.txt
├── 2.txt
└── 3.txt

1 directory, 5 files

软连接也可以链接目录

[root@linux1 ~]# ln -s /root/123/234/ /root/123/345/
[root@linux1 ~]# tree 123
123
├── 1.txt
├── 234
│   ├── 1.txt
│   └── 2.txt -> /root/123/2.txt
├── 2.txt
├── 345
│   └── 234 -> /root/123/234/
└── 3.txt

3 directories, 5 files
  • 注:删除软连接目录时,后面不要加/

相对路径软连接有弊端,之前我们用到的是绝对路径,在同一个路径创建软连接就是相对路径

[root@linux1 tmp]# touch 1.txt
[root@linux1 tmp]# ln -s 1.txt 2.txt 注:2.txt前提没有创建
[root@linux1 tmp]# ll
总用量 64
-rw-r--r--. 1 root root     0 8月  30 21:15 1.txt
lrwxrwxrwx. 1 root root     5 8月  30 21:15 2.txt -> 1.txt

如果复制到另外一台机器上或者目录改动,那么软连接就会失效,尽量使用绝对路径。将22.txt移动到/root/123目录下,查看

[root@linux1 tmp]# mv 1.txt /root/123/
[root@linux1 tmp]# ll
总用量 64
lrwxrwxrwx. 1 root root     5 8月  30 21:15 2.txt -> 1.txt 这时候1.txt在闪烁

但是新建一个改文件,恢复正常

[root@linux1 tmp]# touch 1.txt

软连接的使用场景演示:

假设现在有一个服务器server,会生成一个日志文件run.log,路径在/boot/run.log,但是boot目录空间要满了,这时候可以把run.log复制到/目录下

# cp -i /boot/run.log /root/run.log

马上删除/boot下的run.log

rm /boot/run.log

做个软连接

ln -s /root/run.log /boot/run.log

这时候server服务继续使用的是/boot/run.log这个日志文件,是实上是个软连接,真正的位置是在/root目录,有效解决/boot空间内存不足问题。

6.0硬链接

硬连接
命令:  ln 原文件 目标文件
特征:
1.原文件和连接文件的属性完全一样
2.连接文件和原文件的关系类似于:复制+同步更新
3.当原文件丢失,硬连接文件还可以访问
4.不能跨分区,不能针对目录使用
5.原理:
原文和硬链接文件的i节点号是相同的(ls -i),1个文件名对应一个i节点,1个i节点可以通过多个文件名访问,所以,他们的属性完全相同,并且修改了其中一个的内容另一个也会跟着修改件

语法:ln 源文件 硬链接文件

[root@linux1 ~]# touch 1.log
[root@linux1 ~]# ln 1.log 2.log 注:2.log存在

1.log和2.log inode相同

技术图片

运行上面这条命令以后,源文件与目标文件inode号码相同,都是指向同一个inode,inode信息中的一项叫做硬链接,记录指向该inode的文件总数,这时就会增加1.

反过来说,删除一个文件名,就会使得inode节点“连接数”减1。当值为0时,表示没有文件名指向这个inode,系统就会回收这个inode号码和对应的block区域

以上是关于linux文件与目录的主要内容,如果未能解决你的问题,请参考以下文章

代码适用于与单个 html 文件不同的堆栈片段

-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

python常用代码片段总结

linux下如何查看文件夹大小?硬盘使用情况?内存使用情况?