6.1 目录与路径
6.1.2 目录的相关操作
| 命令 | 含义 | 用法 | 参数 |
|---|---|---|---|
| cd | Change Directory 变换目录 | cd ~user2 进入使用者的主文件夹cd ~ 或cd 回到自己的主文件夹cd - 回到刚刚的目录cd ../postfix 进入某目录 | |
| pwd | Print Working Directory 显示目前的目录 | pwd -P显示目前的目录 | -P :显示出确实的路径,而非使用链接 (link) 路径 |
| mkdir | make directory 创建一个新的目录 | mkdir -p test1/test2/test3创建多层目录mkdir -m 711 test2 创建权限为rwx–x–x的目录 | -m :设置文件的权限,不需要看默认权限。最终权限 = 777 - umask,默认用户环境中umask = 022 -p :将所需要的目录(包含上层目录)递回创建起来 |
| rmdir | remove directory 删除一个空的目录 | rmdir -p test1/test2/test3/test4删除多层空目录 | -p :连同“上层”“空的”目录也一起删除 |
6.1.3 可执行文件路径的变量:$PATH
当我们在执行一个指令时,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!
| |
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 创建的是"软链接",也就是我们常说的"快捷方式"
| |
cp -l 创建的是"硬链接",指向同一个 inode,第二栏的数字(link count)从1变成了2,本质上和原文件是同一个文件,只是有两个文件名指向它。当删除其中一个时不影响另外一个,修改任意一个另一个立刻变化(看不出“谁是原文件”)。
| |
当你创建一个文件时,它有一个链接计数(通常是1)每创建一个硬链接,链接计数就加1,反之减一。链接计数变成0时,系统才会真正删除文件内容
| |
将多个文件复制到目录下
| |
| 维度 | cp -l(硬链接) | cp -s(软链接) |
|---|---|---|
| inode | ✅ 相同 | ❌ 不同 |
| 指向方式 | 数据本身 | 文件路径 |
| 跨文件系统 | ❌ 不行 | ✅ 可以 |
| 链接目录 | ❌ 不行 | ✅ 可以 |
| 原文件删除 | ✅ 仍可用 | ❌ 失效 |
| 修改影响 | ✅ 双向同步 | ✅ 通过路径访问 |
| 常见用途 | 快照、节省空间 | 目录映射、别名 |
由于 cp 有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚的了解到: • 是否需要完整的保留来源文件的信息? • 来源文件是否为链接文件 (symbolic link file)? • 来源文件是否为特殊的文件,例如 FIFO, socket 等? • 来源文件是否为目录?
rm 移除文件或目录
| |
| 参数 | 含义 | 举例 |
|---|---|---|
| -f | 就是 force 的意思,忽略不存在的文件,不会出现警告讯息 | |
| -i | 互动模式,在删除前会询问使用者是否动作 | rm -i bashrc* |
| -r | 递回删除啊!最常用在目录的删除了!这是非常危险的选项!!! | rm -r /tmp/etc |
身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除
mv 移动文件与目录,或更名
| 参数 | 含义 |
|---|---|
| -f | 就是 force 的意思,如果目标文件已经存在,不会询问而直接覆盖 |
| -i | 若目标文件 (destination) 已经存在时,就会询问是否覆盖 |
| -r | 目标文件已经存在,且 source 比较新,才会更新 (update) |
文件改名(还有个指令叫rename)
| |
移动多个来源文件或目录,则最后一个目标文件一定是“目录!”
| |
6.2.3 取得路径的文件名称与目录名称
每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达 255 个字符
basename获取文件名
| |
basedir获取目录名
| |
详见第三篇内的 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的效果
| |
-n rz -w 2的效果
| |
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 都是以“行”为单位
| |
如果接的是负数,例如上面范例的-n -100时,代表列出所有行数, 但不包括后面100行
| |
有数据写入时就立刻显示到屏幕上, 就利用 -f 这个选项,一直侦测文件,新加入的数据都会被显示到屏幕上(摁下Ctrl c会离开tail的侦测)
显示 /etc/man_db.conf 的第 11 到第 20 行,并添加行号
| |
管线的意思是:“前面的指令所输出的讯息,请通过管线交由后续的指令继续使用”
6.3.4 非纯文本文件:od
Octal Dump
事实上,由于可执行文件通常是 binary file,使用上头提到的指令来读取他的内容时, 会产生类似乱码的数据,可以利用 od 这个指令来读取
| |
| 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 读
| |
某些情况下,由于BIOS的设置错误,导致系统时间跑到未来时间并且你又创建了某些文件。 等你将时间改回正确的时间时,该文件不就变成来自未来
| |
| 参数 | 含义 | 示例 |
|---|---|---|
| -a | 仅修订 access time | |
| -c | 仅修改文件的时间,若该文件不存在则不创建新文件 | 如果文件不存在,命令不会创建新文件touch -c non_existing_file |
| -m | 仅修改 mtime | |
| -d | 后面可以接欲修订的日期而不用目前的日期,也可以使用 –date=“日期或时间” | touch -m -d "2024-10-01" file.txttouch -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 配置文件,因此,我们可以 复制文件:
| |
修改属性:
| |
6.4 文件与目录的默认权限与隐藏权限
一个文件有若干个属性, 包括读写执行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是链接文件 (l) 等等的属性。修改属性的方法在前面也约略提过了(chgrp, chown, chmod)
除了基本r, w, x权限外我们还可以设置其他的系统隐藏属性(只能增加/不能删除等), 这部份可使用chattr来设置,lsattr查看
6.4.1 文件默认权限:umask
创建一个新的文件或目录时,他的默认权限与 umask 有关。 umask 就是指定 “目前使用者在创建文件或目录时候的权限默认值”
查阅的方式有两种:
| |
在默认权限的属性上,目录与文件是不一样的。 x 权限对于目录是非常重要的! 但是一般文件的创建则不应该有执行的权限。因此,默认的情况如下:
| 文件 | 目录 | |
|---|---|---|
| 初始默认 | 没有可执行( x )权限,亦即只有 rw 这两个项目 | x 与是否可以进入此目录有关,因此默认为所有权限均开放 |
| 最大分数 | 666 | 777 |
| 默认权限 | -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
| |
相比普通用户,root 更“保守”,不给 group/others 写权限(因为 root 创建的东西很可能属于系统关键文件)所以root 的 umask 默认是 022 ;普通用户umask 为 002 。
6.4.2 文件隐藏属性
chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效,为文件提供了真正的保护,可以防止意外删除或篡改。设置的属性是隐藏的性质,所以需要以 lsattr 才能看到该属性
File Sys Introduction
| 文件系统 Extended File System | Ext2 | Ext3 | Ext4 |
|---|---|---|---|
| 年代 | 比较老 | 改进版 | 现代版 |
| 特点 | 无日志:突然断电/系统崩溃,文件系统就可能损坏。系统重启后要全盘扫描 | 有日志Ext3 = Ext2 + Journal(日记功能) 系统重启后查看日志,按日志恢复操作 | 更快更安全 ✅ 支持更大文件 ✅ 支持更大磁盘 ✅ 延迟分配(delayed allocation) ✅ extent(区块连续存储) ✅ journal 优化 ✅ fsck 更快 ✅ I/O 性能更高 |
| 存储方式 | 1GB 文件拆成上万个离散 block 寻址效率低 | extent(区段) 从 block1000 连续存 2000 个 block用一条记录就行 |
使用场景
| 场景 | 常用 FS | 全称 | 支持 |
|---|---|---|---|
| Linux 默认 | Ext4 | Extended File System | |
| 大数据(Hadoop) | Ext4 / XFS | Extended File System | |
| 云服务器 | Ext4 | Extended File System | |
| Docker 存储 | overlay2 + Ext4/XFS | Extended File System | |
| Windows | NTFS | New Technology File System | 文件权限控制(ACL)、文件压缩、文件加密、最大 16EB 分区、单个文件可大于4GB、日志(Journal)、恢复能力强 但不能跨平台 |
| macOS | APFS | Apple File System | 专门为 SSD、 闪存设备优化设计。 写时复制Copy-On-Write(新数据写好再替换就指针)、Snapshot、原生加密、空间共享Space Sharing(多个分区可以共享同一块存储空间)。 Unix 权限兼容的文件系统(本质是 Unix 系统) |
| U盘 | FAT32 | File Allocation Table 32 | 非常古老,兼容性极强它可以被: Windows、macOS、Linux、电视、相机、车载系统、游戏机全部识别 但FAT32 单最大=4GB,超过会失败 |
| exFAT | Extended 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 参数,这样文件只能增加,但是不能修改旧有的数据与删除的参数
| |
lsattr (显示文件隐藏属性)
| 参数 | 含义 |
|---|---|
| -a | 将隐藏文件的属性也秀出来 |
| -d | 如果接的是目录,仅列出目录本身的属性而非目录内的文件名 |
| -R | 连同子目录的数据也一并列出来 |
| |
使用 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的 x | Set UID | x->s: rwsr-xr-x | chmod u=rwxs,go=x test; ls -l test | chmod u=rwxs,go=x test; ls -l test |
| SGID | 在文件group的 x | Set GID | x->s: -rwxr-sr-x | ||
| SBIT | 在文件others的 x | Set Sticky Bit | x->t: -rwxr-xr-t |
| |
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。
- userA 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示userA能执行 passwd;
- passwd 的拥有者是 root 这个帐号;
- userA 执行 passwd 的过程中,会“暂时”获得 root 的权限;
- /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来设置
举例
| |
显示:-rws--x--x
user = rws(rwx+SUID)
group = –x(group = –x)
others = –x (others = –x)
| |
显示:-rws--s--t
user rws
group –s
others –t
6.4.4 文件类型 file
某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函数库 (share library) 等等的信息
| |
6.5 指令与文件的搜索
6.5.1 查找命令的完整文件名 which
| |
因为 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 -44天内被更动过的文件文件名 |
| -newer file | file 为一个存在的文件,列出比 file 还要新的文件文件名 | find /etc -newer /etc/passwd如果文件日期比 /etc/passwd 新就列出 |
| |
- 与使用者或群组名称相关的参数
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 对应的文件 | 查孤儿文件(安全审计必用) |
| -nouser | user 不存在 /etc/passwd 的文件 | find / -nouser不属于任何人的文件 |
| -nogroup | group 不存在 /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 {} +; |
| 将结果打印到屏幕上 |