六、Linux 文件与目录管理

Linux 文件与目录管理基础,包括目录操作、文件查看、复制移动、权限设置以及文件搜索等常用命令

次阅读

6.1 目录与路径

6.1.2 目录的相关操作

命令含义用法参数
cdChange Directory
变换目录
cd ~user2 进入使用者的主文件夹
cd ~ cd 回到自己的主文件夹
cd - 回到刚刚的目录
cd ../postfix 进入某目录
pwdPrint Working Directory
显示目前的目录
pwd -P显示目前的目录-P :显示出确实的路径,而非使用链接 (link) 路径
mkdirmake directory
创建一个新的目录
mkdir -p test1/test2/test3创建多层目录
mkdir -m 711 test2 创建权限为rwx–x–x的目录
-m :设置文件的权限,不需要看默认权限。最终权限 = 777 - umask,默认用户环境中umask = 022
-p :将所需要的目录(包含上层目录)递回创建起来
rmdirremove directory
删除一个空的目录
rmdir -p test1/test2/test3/test4删除多层空目录-p :连同“上层”“空的”目录也一起删除

6.1.3 可执行文件路径的变量:$PATH

当我们在执行一个指令时,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!

1
2
user2@DESKTOP-I0DQE4R:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

PATH变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开。所以可以在任何地方执行ls来找到/bin/ls可执行文件

如果PATH中没有定义某个指令所在目录,那么要用/root/ls指定命令的地址才能调用

  • 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与dmtsai);

  • PATH是可以修改的;

  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;

  • 指令应该要放置到正确的目录下,执行才会比较方便;

  • 本目录(.)最好不要放到PATH当中

6.2 文件与目录管理

6.2.1 文件与目录的检视: ls

很多distribution 在默认的情况中, 已经将 ll (L 的小写) 设置成为 ls -l 的意思(这个功能是 Bash shell 的 alias 功能)

参数含义
-a(all)全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-d(directory)仅列出目录本身,而不是列出目录内的文件数据(常用)
-l(long format)长数据串行出,包含文件的属性与权限等等数据;(常用)
-f(fast / no sort)直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
-F(file type indicator)
历史语义
根据文件、目录等信息,给予附加数据结构
*代表可可执行文件
/代表目录;
=:代表 socket 文件
|代表 FIFO文件
-h (human-readable)将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来
-i列出 inode 号码
-A(almost all)全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录
-n列出 UID 与 GID 而非使用者与群组的名称
-r(reverse)将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
-R(Recursive)
大写 R 是历史约定
连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
-S(size)以文件大小大小排序,而不是用文件名排序
-t(time)依时间排序,而不是用文件名
–color=never:不要依据文件特性给予颜色显示
=always :显示颜色
=auto :让系统自行依据设置来判断是否给予颜色
–full-time以完整时间模式 (包含年、月、日、时、分) 输出
–time={atime,ctime}输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间(modification time)

6.2.2 复制、删除与移动: cp, rm, mv

cp 复制文件或目录

参数参数含义
-a(archive)= -dr –preserve=all 的意思 归档模式:递归复制、保留所有属性、保留符号链接
-a = -dR –preserve=all
-i(interactive)若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-p(preserve)连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(-p 是 –preserve 的子集)
-r(recursive)递回持续复制,用于目录的复制行为;(常用)
-d(no dereference)若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身
-f(force)为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次
-l(link)进行硬式链接(hard link)的链接文件创建,而非复制文件本身,指向同一个 inode
-s(symbolic link)复制成为符号链接文件,亦即“捷径”文件(很小),指向文件路径字符串
-u(update)destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
–preserve=all除了 -p 的权限相关参数外,还加入 SELinux 的属性, links,xattr 等也复制了

目的文件的拥有者通常会是指令操作者本身,由于具有这个特性,进行备份的时需要特别注意的特殊权限文件, 例如密码档 (/etc/shadow) 以及一些配置文件,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制文件权限的选项才行

-s vs -l

cp -s 创建的是"软链接",也就是我们常说的"快捷方式"

1
lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc

cp -l 创建的是"硬链接",指向同一个 inode,第二栏的数字(link count)从1变成了2,本质上和原文件是同一个文件,只是有两个文件名指向它。当删除其中一个时不影响另外一个,修改任意一个另一个立刻变化(看不出“谁是原文件”)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
fileA        fileB                                    fileA                  fileB
  |            |                                        |                      |
  v            v                                        v                      v
+----------------+                                  +--------+          +--------------+
| inode 12345   |  ← 同一个 inode(链接计数=2)        | inode  |          | inode 67890  |
+----------------+                                  +--------+          +--------------+
        |                                               |                      |
        v                                               v                      v
+----------------+                                +----------------+   "fileA"   ← 路径字符串
| data blocks    |                                | data blocks    |
| "Hello World"  |                                | "Hello World"  |
+----------------+                                +----------------+

当你创建一个文件时,它有一个链接计数(通常是1)每创建一个硬链接,链接计数就加1,反之减一。链接计数变成0时,系统才会真正删除文件内容

1
-rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc_hlink

将多个文件复制到目录下

1
cp ~/.bashrc ~/.bash_history /tmp
维度cp -l(硬链接)cp -s(软链接)
inode✅ 相同❌ 不同
指向方式数据本身文件路径
跨文件系统❌ 不行✅ 可以
链接目录❌ 不行✅ 可以
原文件删除✅ 仍可用❌ 失效
修改影响✅ 双向同步✅ 通过路径访问
常见用途快照、节省空间目录映射、别名

由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到: • 是否需要完整的保留来源文件的信息? • 来源文件是否为链接文件 (symbolic link file)? • 来源文件是否为特殊的文件,例如 FIFO, socket 等? • 来源文件是否为目录?

rm 移除文件或目录

1
rm [-fir] 文件或目录
参数含义举例
-f就是 force 的意思,忽略不存在的文件,不会出现警告讯息
-i互动模式,在删除前会询问使用者是否动作rm -i bashrc*
-r递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!rm -r /tmp/etc

身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除

mv 移动文件与目录,或更名

参数含义
-f就是 force 的意思,如果目标文件已经存在,不会询问而直接覆盖
-i若目标文件 (destination) 已经存在时,就会询问是否覆盖
-r目标文件已经存在,且 source 比较新,才会更新 (update)

文件改名(还有个指令叫rename)

1
mv mvtest mvtest2

移动多个来源文件或目录,则最后一个目标文件一定是“目录!”

1
 mv bashrc1 bashrc2 mvtest2

6.2.3 取得路径的文件名称与目录名称

每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达 255 个字符

basename获取文件名

1
2
user2@DESKTOP-I0DQE4R:~$ basename /tmp/testing/testfile
testfile 

basedir获取目录名

1
2
user2@DESKTOP-I0DQE4R:~$ dirname /tmp/testing/testfile
/tmp/testing

详见第三篇内的 shell scripts

6.3 文件文件内容查阅

指令用途
cat由第一行开始显示文件内容
tac从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl显示的时候,顺道输出行号
more一页一页的显示文件内容
less与 more 类似,但是比 more 更好的是,他可以往前翻页
head只看头几行
tail只看尾巴几行
od以二进制的方式读取文件内容

6.3.1 直接检视文件内容

使用 cat/tac/nl

命令参数范例
cat/tac
concatenate
将一个文件的内容连续的印出在屏幕上
/由最后一行到第一行反向打印在屏幕上
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;cat -A /etc/man_db.conf
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;cat -n /etc/issue
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
nl
添加行号,打印可以将行号做比较多的显示设计
-b :指定行号指定的方式,主要有两种:
    -b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
    -b t :如果有空行,空的那一行不要列出行号(默认值);
nl -b a /etc/issue
```-n :列出行号表示的方法,主要有三种:
    -n ln :行号在屏幕的最左方显示;
    rz-n rn :行号在自己字段的最右方显示,且不加 0 ;
    -n rz :行号在自己字段的最右方显示,且加 0 ;
nl -n rz /etc/issue

-w :行号字段的占用的字符数。和-n一起用才能看出来效果
nl -n rz -w 3 /etc/issue

nl加上-b a的效果

1
2
3
4
5
6
root@DESKTOP-I0DQE4R:~ nl /etc/issue
     1  Ubuntu 24.04.1 LTS \n \l

root@DESKTOP-I0DQE4R:~# nl -b a /etc/issue
     1  Ubuntu 24.04.1 LTS \n \l
     2

-n rz -w 2的效果

1
2
3
root@DESKTOP-I0DQE4R:~# nl -b a -n rz -w 2 /etc/issue
01      Ubuntu 24.04.1 LTS \n \l
02

6.3.2 可翻页检视

使用 more 与 less

如果 more 后面接的文件内容行数大于屏幕输出的行数时,最后一行会显示出目前显示的百分比,在最后一行输入一些有用的指令

参数含义
空白键 (space)代表向下翻一页
Enter代表向下翻“一行”
/字串代表在这个显示的内容当中,向下搜寻“字串”这个关键字
:f立刻显示出文件名以及目前显示的行数
q代表立刻离开 more ,不再显示该文件内容
b 或 [ctrl]-b代表往回翻页,不过这动作只对文件有用,对管线无用

less可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件

参数含义
空白键 (space)代表向下翻一页
pagedown/pageup向下/上翻动一页
/字串     ?字串向下/上搜寻“字串”的功能
n/N反向的重复前一个搜寻 (与 / 或 ? 有关!)
g/G前进到这个数据的第一行/最后一行
q离开 less 这个程序

6.3.3 数据提取

取出文件前面几行(head) 或取出后面几行 (tail) 文字的功能。head 与 tail 都是以“行”为单位

1
head [-n number] 文件  (默认的情况中,显示前面十行)

如果接的是负数,例如上面范例的-n -100时,代表列出所有行数, 但不包括后面100行

1
tail [-n number] 文件  (默认的情况中,显示最后十行)

有数据写入时就立刻显示到屏幕上, 就利用 -f 这个选项,一直侦测文件,新加入的数据都会被显示到屏幕上(摁下Ctrl c会离开tail的侦测)

显示 /etc/man_db.conf 的第 11 到第 20 行,并添加行号

1
cat -n /etc/man_db.conf | head -n 20 | tail -n 10

管线的意思是:“前面的指令所输出的讯息,请通过管线交由后续的指令继续使用”

6.3.4 非纯文本文件:od

Octal Dump

事实上,由于可执行文件通常是 binary file,使用上头提到的指令来读取他的内容时, 会产生类似乱码的数据,可以利用 od 这个指令来读取

1
od [-t TYPE] 文件
TYPE含义
a利用默认的字符来输出
c使用 ASCII 字符来输出
d[size]利用十进制(decimal)来输出数据,每个整数占用 size Bytes
f[size]利用浮点数值(floating)来输出数据,每个数占用 size Bytes
o[size]利用八进位(octal)来输出数据,每个整数占用 size Bytes
x[size]利用十六进制(hexadecimal)来输出数据,每个整数占用 size

6.3.5 修改文件时间或创建新文件: touch

touch 这个指令最常被使用的情况

  • 创建一个空的文件

  • 将某个文件日期修订为目前 (mtime 与 atime)

每个文件在linux下面都会记录三个时间参数

  • modification time (mtime)文件的内容变更(默认显示

  • status time (ctime)文件的状态变更,如权限与属性

  • access time (atime)文件的内容被取用时,如用 cat 读

1
2
3
4
root@DESKTOP-I0DQE4R:/etc# ls -l /etc/ucf.conf ; ls -l --time=atime /etc/ucf.conf ; ls -l --time=ctime /etc/ucf.conf
-rw-r--r-- 1 root root 1260 Jan 27  2023 /etc/ucf.conf
-rw-r--r-- 1 root root 1260 Jan  7  2025 /etc/ucf.conf
-rw-r--r-- 1 root root 1260 Sep  4 17:50 /etc/ucf.conf

某些情况下,由于BIOS的设置错误,导致系统时间跑到未来时间并且你又创建了某些文件。 等你将时间改回正确的时间时,该文件不就变成来自未来

1
touch [-acdmt] 文件
参数含义示例
-a仅修订 access time
-c仅修改文件的时间,若该文件不存在则不创建新文件如果文件不存在,命令不会创建新文件
touch -c non_existing_file
-m仅修改 mtime
-d后面可以接欲修订的日期而不用目前的日期,也可以使用 –date=“日期或时间”touch -m -d "2024-10-01" file.txt
touch -d "yesterday" file.txt
-t后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]touch -t 202405201430.25 file.txt

如果 touch 后面有接文件则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间.若该文件不存在则会主动的创建一个新的空的文件

使用cp命令时数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同,状态(ctime)就变成现在的时间

权限例题:

系统有个一般身份使用者userA,他的群组属于GroupA,他的主文件夹在 /home/userA。 你是root,你想将你的 ~/.bashrc 复制给他,可以怎么做?

root 虽然可以将这个文件复制给 userA,不过这个文件在 userA的主文件夹中却可能让 userA没有办法读写(因为该文件属于 root 的嘛!而 userA又不能使用 chown 之故)此外,我们又担心覆盖掉 userA自己的 .bashrc 配置文件,因此,我们可以 复制文件:

1
cp ~/.bashrc ~dmtsai/.bashrc

修改属性:

1
chown dmtsai:dmtsai ~dmtsai/.bashrc

6.4 文件与目录的默认权限与隐藏权限

一个文件有若干个属性, 包括读写执行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是链接文件 (l) 等等的属性。修改属性的方法在前面也约略提过了(chgrp, chown, chmod)

除了基本r, w, x权限外我们还可以设置其他的系统隐藏属性(只能增加/不能删除等), 这部份可使用chattr来设置,lsattr查看

6.4.1 文件默认权限:umask

创建一个新的文件或目录时,他的默认权限与 umask 有关。 umask 就是指定 “目前使用者在创建文件或目录时候的权限默认值”

查阅的方式有两种:

1
2
3
4
5
root@DESKTOP-I0DQE4R:~# umask -S
u=rwx,g=rx,o=rx

root@DESKTOP-I0DQE4R:~# umask
0022

在默认权限的属性上,目录与文件是不一样的。 x 权限对于目录是非常重要的! 但是一般文件的创建则不应该有执行的权限。因此,默认的情况如下:

文件目录
初始默认没有可执行( x )权限,亦即只有 rw 这两个项目x 与是否可以进入此目录有关,因此默认为所有权限均开放
最大分数666777
默认权限-rw-rw-rw-drwxrwxrwx
当umask=002(-rw-rw-rw-) - (—–w–w-) ==> -rw-r–r–(drwxrwxrwx) - (d—-w–w-) ==> drwxr-xr-x

umask 的分数指的是“该默认值需要减掉的权限,r、w、x 分别是 4、2、1 分。final_permission = default_permission - umask

应用场景

当我们需要新建文件给同群组的使用者共同编辑时(需要r w权限),那么需要给others拿掉w权限即2,所以设置 umask = 002。得到文件的权限为rw-rw-r–,目录权限为rwxrwxr-x

1
2
3
4
5
6
root@DESKTOP-I0DQE4R:~# umask 002
root@DESKTOP-I0DQE4R:~# mkdir TestDir002
root@DESKTOP-I0DQE4R:~# touch testfile002
root@DESKTOP-I0DQE4R:~# ll -d test*
# drwxrwxr-x 2 root root 4096 Mar 27 16:48 testDir002/
# -rw-rw-r-- 1 root root    0 Mar 27 16:48 testfile002

相比普通用户,root 更“保守”,不给 group/others 写权限(因为 root 创建的东西很可能属于系统关键文件)所以root 的 umask 默认是 022 ;普通用户umask 为 002 。

6.4.2 文件隐藏属性

chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效,为文件提供了真正的保护,可以防止意外删除或篡改。设置的属性是隐藏的性质,所以需要以 lsattr 才能看到该属性

File Sys Introduction

文件系统
Extended File System
Ext2Ext3Ext4
年代比较老改进版现代版
特点无日志:突然断电/系统崩溃,文件系统就可能损坏。系统重启后要全盘扫描有日志Ext3 = Ext2 + Journal(日记功能)
系统重启后查看日志,按日志恢复操作
更快更安全
✅ 支持更大文件
✅ 支持更大磁盘
✅ 延迟分配(delayed allocation)
✅ extent(区块连续存储)
✅ journal 优化
✅ fsck 更快
✅ I/O 性能更高
存储方式1GB 文件拆成上万个离散 block
寻址效率低
extent(区段)
从 block1000 连续存 2000 个 block用一条记录就行

使用场景

场景常用 FS全称支持
Linux 默认Ext4Extended File System
大数据(Hadoop)Ext4 / XFSExtended File System
云服务器Ext4Extended File System
Docker 存储overlay2 + Ext4/XFSExtended File System
WindowsNTFSNew Technology File System文件权限控制(ACL)、文件压缩、文件加密、最大 16EB 分区、单个文件可大于4GB、日志(Journal)、恢复能力强
但不能跨平台
macOSAPFSApple File System专门为 SSD、 闪存设备优化设计。
写时复制Copy-On-Write(新数据写好再替换就指针)、Snapshot、原生加密、空间共享Space Sharing(多个分区可以共享同一块存储空间)。
Unix 权限兼容的文件系统(本质是 Unix 系统)
U盘FAT32File Allocation Table 32非常古老,兼容性极强它可以被:
Windows、macOS、Linux、电视、相机、车载系统、游戏机全部识别
但FAT32 单最大=4GB,超过会失败
exFATExtended FAT取消了单文件4GB限制

NTFS、FAT32、exFAT可以执行chmod 777 file但权限不会真的生效(因为磁盘底层不支持 inode 权限位,没有 Linux rwx 权限模型)权限位(rwx)、inode、ACL、sticky bit、SUID / SGID都是Linux系统提出的

chattr (设置文件隐藏属性)

参数含义
+增加某一个特殊参数,其他原本存在参数则不动
-移除某一个特殊参数,其他原本存在参数则不动
=设置一定,且仅有后面接的参数
A当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改
可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S一般文件是非同步写入磁盘的,如果加上 S 这个属性时,
当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
c这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
i他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!
对于系统安全性有相当大的助益!只有 root 能设置此属性
s当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,
所以如果误删了,完全无法救回来了喔!
u与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!

设置了+i属性的文件,即便是root用户也无法删除。 +i 与 +a 常用于在系统的数据安全,log file 这种的登录文件,就更需要 +a 参数,这样文件只能增加,但是不能修改旧有的数据与删除的参数

1
2
3
4
root@DESKTOP-I0DQE4R:/tmp# touch attrtest
root@DESKTOP-I0DQE4R:/tmp# chattr +i attrtest
root@DESKTOP-I0DQE4R:/tmp# rm attrtest
rm: cannot remove 'attrtest': Operation not permitted

lsattr (显示文件隐藏属性)

参数含义
-a将隐藏文件的属性也秀出来
-d如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R连同子目录的数据也一并列出来
1
2
3
root@DESKTOP-I0DQE4R:/tmp# chattr +aiS attrtest
root@DESKTOP-I0DQE4R:/tmp# lsattr attrtest
--S-ia--------e------- attrtest

使用 chattr 设置后,可以利用 lsattr 来查阅隐藏的属性。如果将 /etc/shadow 这个重要的密码记录文件给他设置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增。

6.4.3 文件特殊权限: SUID, SGID, SBIT

查看 /tmp 和 /usr/bin/passwd 的权限,发现还有其他的特殊权限( x位置变成了s和 t )

✅ s / t = 特殊权限存在 + x 存在(有效) ✅ S / T= 特殊权限存在 + x 不存在(无效,占位显示)

出现位置含义示例数字设置符号设置
SUID在文件owner的 xSet UIDx->s: rwsr-xr-xchmod u=rwxs,go=x test; ls -l testchmod u=rwxs,go=x test; ls -l test
SGID在文件group的 xSet GIDx->s: -rwxr-sr-x
SBIT在文件others的 xSet Sticky Bitx->t: -rwxr-xr-t
1
2
3
root@DESKTOP-I0DQE4R:/tmp# ls -ld /tmp; ls -l /usr/bin/passwd
drwxrwxrwt 9 root root 4096 Dec  4 09:53 /tmp
-rwsr-xr-x 1 root root 64152 May 30  2024 /usr/bin/passwd

SUID

当 s 这个标志出现在文件owner的 x 权限上时,如-rwsr-xr-x此时就被称为 Set UID,简称为SUID 的特殊权限,SUID有这样的限制与功能: • SUID 权限仅对二进制程序(binary program)有效; • 执行者对于该程序需要具有 x 的可执行权限; • 本权限仅在执行该程序的过程中有效 (run-time); • 执行者将具有该程序拥有者 (owner) 的权限

举个例子: Linux 系统中,所有帐号的密码都记录在 /etc/shadow中,权限为 ---------- 1 root root仅有root可读且仅有root可以强制写入,但是一般帐号使用者修改自己的密码

答:——关键不在于直接去碰那个被锁得死死的 /etc/shadow文件,而在于一个被赋予了特殊“权力”的桥梁——/usr/bin/passwd命令,命令的权限为-rwsr-xr-x任何用户在执行这个程序时,进程的有效用户ID(euid) 会暂时变更为该程序文件的所有者(通常是 root)的 ID,而不是当前执行它的用户的 ID。

  1. userA 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示userA能执行 passwd;
  2. passwd 的拥有者是 root 这个帐号;
  3. userA 执行 passwd 的过程中,会“暂时”获得 root 的权限;
  4. /etc/shadow 就可以被 userA 所执行的 passwd 所修改。

SUID 仅可用在binary program 上, 不能够用在 shell script (调用binary的程序)

SGID

当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID(如:-rwx–s–x),简称为SGID 的特殊权限。与 SUID 不同的是,SGID 可以针对文件或目录来设置SGID

文件目录
SGID 对二进制程序有用使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
程序执行者对于该程序来说,需具备 x 的权限使用者在此目录下的有效群组(effective group)将会变成该目录的群组
执行者在执行的过程中将会获得该程序(group)的支持用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同

SBIT:Sticky Bit

只针对目录有效,作用是: • 当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时; • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

如果将 A 目录加上了 SBIT 的权限时, 只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

设置SUID/SGID/SBIT 权限

4 为 SUID、2 为 SGID、1 为 SBIT

假设要将一个文件权限改为“-rwsr-xr-x”时,由于 s 在owner权限中,所以是SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:chmod 4755 filename来设置

举例

1
chmod u=rwxs,go=x test; ls -l test

显示:-rws--x--x

  • user = rws(rwx+SUID)

  • group = –x(group = –x)

  • others = –x (others = –x)

1
chmod g+s,o+t test

显示:-rws--s--t

  • user rws

  • group –s

  • others –t

6.4.4 文件类型 file

某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函数库 (share library) 等等的信息

1
2
[root@study ~]# file ~/.bashrc
/root/.bashrc: ASCII text ;==告诉我们是 ASCII 的纯文本文件啊!

6.5 指令与文件的搜索

6.5.1 查找命令的完整文件名 which

1
2
3
[root@study ~]# which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

因为 history 是“bash 内置的指令”啦! 但是 which 默认是找 PATH内所规范的目录,所以当然一定找不到的

6.5.1 查找指定文件的路径 whereis locate find

where 只找系统中某些特定目录下面的文件,所以会比find快

参数功能示例
-l列出 whereis 会去查询的主要目录
/bin、/sbin、/usr/share/man等
-b()只找 binary 格式的文件
-m只找在说明文档 manual 路径下的文件whereis -m passwd
-s只找 source 来源文件
-u搜寻不在上述三个项目当中的其他特殊文件

locate / updatedb

locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,而数据库的创建默认是在每天执行一次。所以当你新创建起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你“找不到。更新 locate 数据库的方法非常简单,直接输入updatedb

  • updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件

  • locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。

参数功能示例
-i(ignore case)忽略大小写
-c(count)不输出文件名,仅计算找到的文件数量
-l(limit)限制输出行数locate -l 5 passwd
-S(statistics)查看数据库统计信息,(文件/目录数量等)locate -S
-r(regex/regexp)正则匹配

find

  • 与时间有关的选项:共有 -atime, -ctime 与 -mtime
参数功能示例
-mtime n在 n 天之前的“一天之内”被更动过内容的文件find / -mtime 0
从现在开始到 24 小时前
-mtime +n在 n 天之前(不含 n 天本身)被更动过内容的文件文件名
-mtime -n在 n 天之内(含 n 天本身)被更动过内容的文件文件名find /var -mtime -4
4天内被更动过的文件文件名
-newer filefile 为一个存在的文件,列出比 file 还要新的文件文件名find /etc -newer /etc/passwd
如果文件日期比 /etc/passwd 新就列出
1
2
3
<------(+4) <-(4)-> --------(+4)-------->

7    6    5        4    3    2    1    现在
  • 与使用者或群组名称相关的参数

1️⃣ 先去 /etc/passwd 或 /etc/group 查 username的映射 2️⃣ 查到 username对应的 UID=1001 3️⃣ 再去 inode 里面匹配 UID

参数功能示例
-uid n查找 UID对应的文件
-gid n查找 GID对应的文件
-user name查找 username 对应的文件find /home -user dmtsai
搜寻 /home 下面属于 dmtsai 的文件
-group name查找 groupname 对应的文件查孤儿文件(安全审计必用)
-nouseruser 不存在 /etc/passwd 的文件find / -nouser
不属于任何人的文件
-nogroupgroup 不存在 /etc/group 的文件
  • 与文件权限及名称有关的参数
参数功能示例
-name filename搜寻文件名称为 filename 的文件find / -name "*passwd*"
找出文件名包含 passwd 这个文件
-size [+-]SIZE搜寻比 SIZE 还要大(+)或小(-)的文件
c: 代表 Byte, k: 代表 1024Bytes
find / -size +50k
-type TYPE搜寻文件的类型为 TYPE 的文件
一般正规文件 (f),设备文件 (b, c),目录 (d)
链接文件 (l), socket (s), 及 FIFO (p)
find /run -type s
找出 /run 目录下,文件类型为 Socket 文件名
-perm mode搜寻文件权限 = mode 的文件
-perm -mode搜寻文件每一位权限 都与 mode每位>=的文件find / -perm /7000
同时含有 —s–s–t 的所有三个权限
-perm /mode用户 or 组 or 其它 权限 >= mode文件find /usr/bin /usr/sbin -perm /6000
/usr/bin和/usr/sbin 目录下, 只要具有 SUID 或 SGID 就列出来
  • 额外动作
参数功能示例
-exec command-exec 后面可再接额外的指令来处理搜寻到的结果(指令不支持命令别名)
-exec 必须指定“对每个匹配结果执行的命令”,并用\ 表示“每找到一个就执行一次”(分次print)
+表示“尽量批量执行(一起print,更高效)”
还必须用{}作为“当前找到的文件”的占位符
find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} +;
-print将结果打印到屏幕上
使用 Hugo 构建
主题 StackJimmy 设计
无法复制,本站文章内容受保护