Linux与MAC文件、目录与磁盘格式

Sl0th Lv4

Linux与MAC OS文件、目录学习笔记

0x01 文件权限

用户与用户组

在Linux或MAC下多个用户可以共用一个系统/一台服务器,因此系统既要包含各用户共用文件及各自私有文件,在这种情况下权限配置显得极其重要。但是若用户间是合作团队关系,可以互相访问各自私有文件,若还是采用分别对用户进行文件访问授权,显得效率低下,因此产生了用户组,使得组内用户获得与组相同权限,用户组实质上是具有相同特征用户的逻辑集合。

root用户及其用户组

Linux中,对于任何一个文件都有”User,Group,Others”3种身份,而对于文件来说root用户便是与User拥有等同权限的特殊Others。root用户组与普通用户组也一样受权限限制,组内用户并没有与root用户等同甚至更高权限。

而MAC下由于引入系统完整性保护(SIP)机制,连root用户都无法在/、/usr目录下新建文件

SIP机制一般不建议关闭,在不关闭前提下仍可以利用软链接的方式在根目录下创建替身

文件权限

操作文件时,若看见Permission deny字样,一般是文件权限配置问题。可以通过以下命令通过查看文件属性来查看权限

1
2
3
4
ls -al   # 可以查看该目录下所有文件包括隐藏文件(.开头)
# 回显
-rw-r--r-- 1 sloth staff 12288 Nov 26 09:41 .bash_profile.swm
#[文件权限] [连接数][所有者][用户组] [文件容量/B] [创建/修改日期] [文件名]

表示为文件权限的字符串由10个字符组成

  • 第一个字符表示文件类型:d(目录) -(文件) l(连接文件) b(可供存储接口设备) c(串行端口设备)
  • 2-4三个字符为”rwx”的组合表示文件所有者的权限:r(可读) w(可写不包括删除) x(可执行) (删除需要获取父目录的w权限)
  • 5-7三个字符为”rwx”的组合表示同用户组的权限
  • 8-10三个字符为”rwx”的组合表示其他非本用户组的权限

文件名以.开头的称为隐藏文件,mac下显示隐藏文件快捷键:command+shift+.

⚠️mac下创建隐藏文件会提示.开头文件以及被系统预留,不能创建

解决方法:终端输入

1
2
defaults write com.apple.finder AppleShowAllFiles -bool YES
killall Finder

创建完输入

1
2
defaults write com.apple.finder AppleShowAllFiles -bool YES
killall Finder

文件权限及属性的修改

  • chgrp:改变文件所属用户组

    1
    chgrp [-R] dirname/filename        # -R:递归更改,改变子目录下所有文件、目录
  • chown:改变文件所有者

    1
    chown [-R] 用户名称[:用户组名] dirname/filename    # 用户名与用户组间连接也可用'.'但在用户名中含'.'时会造成系统误判,因此不建议
  • chmod:改变文件权限

    1
    2
    3
    4
    chmod [-R] [u/g/o/a][+/-/=][r/w/x]/权限分数 dirname/filename    # +与-更多是修改,而=相当于重置(会清空原来设置)
    # 权限分数的计算
    -rw-r-xr--
    [4+2+0][4+0+1][4+0+0]=654 # rwx表示分数分别为4 2 1

    对于设置4 2 1的理解:421利于计算机存储,4–100 2–010 1–001 如果设置成3 2 1由于系统只接受了和,而当系统接收到3时,无法判断是赋予读权限还是写+执行权限,会造成歧义

    💡除输入以上命令外,mac下有一种略微简便的修改文件读写权限方式,在文件简介中可以修改user、group、all的读写权限(目前还未发现可以加入执行权限的文件类别),递归选项隐藏在左下角

    image-20220514101004553
    image-20220514101004553

    💡mac终端使用小技巧:直接将文件拖入终端会转换成绝对路径(不带引号)

终端切换root用户权限

1
2
3
4
5
su -root
su -
su
# 以上三种要求输入root用户密码
sudo su # 要求输入当前用户密码,切换到root用户

sudo是一种权限管理机制,依赖于/etc/sudoers ⚠️⚠️mac上不要轻易修改sudoers文件权限,这会导致终端无法切换root用户,sudo命令失效⚠️⚠️

补救措施:

  • 电脑仍能正常开机:>系统偏好设置>用户与群组>左下角开锁🔓>登录选项>网络账户服务器:加入>打开目录实用工具>菜单栏的'编辑'>启用Root用户 以root用户登录后便可在终端重新授权,该方式可以解决大多数xxxx is owned by uid 501, should be 0报错
  • 电脑不能正常开机:长按电源键进入恢复模式,里面有个终端可以使用,或进入单用户模式进行修改权限操作

0x02 目录结构

目录配置–FHS标准

FHS依据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用的形态

类别 说明
可分享的(shareable) 可分享给其他系统挂载使用的目录,包括执行文件与用户的邮件数据等
不可分享的(unshareable) 与机器相关的设备文件或与程序相关的socket文件等
不变的(static) 内容不会经常变动,函数库、文件说明文件、系统管理员管理的配置文件等
可变动的(variable) 登录文件、新闻组

Linux下根目录的主要子目录

目录 内容
/bin 存放在单用户模式下仍能执行的终端命令:ls、cat等等
/boot 存放开机时使用到的文件,包括Linux内核文件、开机菜单、开机所需配置文件等
/dev 在linux系统上任何设备与接口设备都以文件形式存在该目录下
/etc 存放系统主要的配置文件,包括人员账号密码、各种服务的起始文件(如mysql的配置文件my.cnf)等 /etc/init.d存放所有服务的默认启动脚本
/home 系统默认主文件夹,也是我们打开终端常见到的~ 主文件夹的另一种代号:~dmtsai代表dmtsai的主文件夹
/lib 存放开机时使用到的函数库,以及/bin、/sbin下命令调用的函数库
/media 放置可删除的设备,光盘、软盘、DVD等
/mnt 存放暂时挂载的某些额外设备
/opt 存放第三方软件(如mac上的软件包神器homebrew)
/root root用户的主文件夹,单用户模式下该目录拥有root的主文件夹
/sbin 开机、修复、还原系统所需命令,这些命令只有root才能够利用来“设置”系统,普通用户只能用于查询
/srv srv–service,存放网络服务所需数据目录www等,不过部分云服务器也会将www目录单独出来放在根目录下
/tmp 用于一般用户或正在执行的程序暂时存放文件,任何人可访问,需定期清理,FHS甚至建议开机时将该目录清空
/lost+found 使用标准的ext2/ext3文件系统格式才会产生的目录,存放文件系统发生错误时的丢失片段
/proc 虚拟文件系统,不含硬盘空间,放置的数据都是内存当中的,如系统内核、进程、外部设备的状态及网络状态
/sys 与/proc类似,记录内核相关信息

⚠️一定不能与根目录分开的目录:/etc /bin /dev /lib /sbin

/usr与/var

/usr下主要目录 (注:usr–UNIX Software Resource 并不是user的缩写)

目录 内容
/usr/bin 绝大部分用户在终端可使用的命令,与/bin的不同(是否与开机有关)
/usr/include c/c++等程序语言的头文件与包含文件,当我们以tarball方式(*.tar.gz)安装数据时,时常用到里面的头文件,装框架的时候不要忘记包含它的include目录(如mac下使用Qt+Clion,就要将Qt的include目录加入CMakeLists.txt)
/usr/X11R6 放置X Window系统重要数据
/usr/lib 各应用软件的函数库、目标文件、不被一般用户惯用的执行文件、脚本 X86_64的Linux系统还有/usr/lib64
/usr/local 系统管理员在本机自行安装下载的软件
/usr/sbin 非系统正常运行所需命令
/usr/share 共享文件,几乎都是文本文件
/usr/src 建议放置源码 src–source 内核源码建议放在/usr/src/linux

/var下主要目录

目录 内容
/var/cache 应用程序本身运行产生的暂存文件
/var/lib 程序执行所需数据文件存放的目录
/var/lock 一次只能被单一程序使用的文件资源或设备
/var/log 登录文件
/var/mail 个人电子邮件信箱
/var/run 程序或服务启动后的PID
/var/spool 排队等待其他应用程序使用的数据,使用后通常被删除

mac下根目录结构

mac根目录一般指macintosh HD,一般情况下可见的只有4个文件夹Applications、Library、System、Users,显示隐藏文件夹后可以看见完整结构

image-20220514161710097
image-20220514161710097

可以发现大部分文件都与Linux上一致,不同的有

目录 内容
/Applications 默认所有的GUI应用程序都安装在这里,也是我们使用dmg安装程序时出现在访达框中的”Applications替身”的本体
/cores 内核转储文(进程崩溃时产生)件存放目录
/private 存放了/tmp, /var, /etc等链接目录的目标目录
/Volumes 文件系统挂载点存放目录
/Library 中文下为”资源库”,存放系统的数据文件、帮助文件、文档等等
/Users 存放用户的个人资料和配置。每个用户有自己的单独目录,除此外还有个shared目录
/System 中存放了系统的绝大部分组件,如各种framework,以及内核模块,字体文件等等,我们会发现子目录中也有一个Applications,里面存放系统自带GUI应用程序

mac下的~是当前用户的顶级目录,指向/User/当前用户名目录

/usr/local与/opt

homebrew是mac下强大的软件包工具(类似于apt-get),可以轻松安装终端命令、服务(例如Mysql数据库)、甚至GUI应用程序等等。而通过命令行安装的homebrew默认放在/opt下,通过homebrew安装的命令或服务都存放在其子目录Cellar下。而当你去官网中下载对应的pkg安装包安装各种服务时,这些服务默认放在/usr/local下

因此观看博客时需要辨别其中本地已有服务的真实位置,可能大多数教程的mysql是使用homebrew安装,因此它的路径一般为/opt/homebrew/Cellar/mysql,但若你是官网安装的mysql,路径则为/usr/local/mysql

💡homebrew的一个使用技巧:

/opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula目录下存储了许多.rb文件,对应着可通过homebrew安装的工具或服务,而为了更轻便,homebrew常将一个大型工具的不常用模块或驱动打包独立出来,以qt为例,执行brew install qt安装的仅是最基础版本,若需要连接mysql的服务要执行brew install qt-mysql,而这些往往不会写在官方文档中,因此我们要学习善用Formula目录,通过查找关键词,找到需要的服务,可以节省很多环境配置的时间

0x03 目录与路径

相对路径与绝对路径

相对路径:利用.、..等特殊目录描述相对于当前目录的文件路径 e.g. ../test.txt

绝对路径:从根目录/开始写起 e.g. /Users/sloth/install.sh

目录相关操作

特殊目录

  • . –当前目录
  • .. –上一级目录
  • - –前一个目录(cd -同时还会回显上一个目录的路径(从~或根目录/开始的绝对路径))
  • ~ –当前用户主文件夹
  • ~example –example用户主文件夹

处理目录的命令

1
2
3
4
cd 目录的绝对路径/相对路径 # 切换目录 change directory
pwd [-P] # 显示当前目录 -P:显示实际目录(原身),而不是连接文件(替身)
mkdir [-m 权限][-p] # 新建目录 -m:配置权限 -p:创建多层目录
rmdir [-p] # 删除一个空目录(删除非空目录会报错) -p:一次性删除多层空目录

环境变量$PATH

$PATH的值一般是多个目录下的集合,当前用户可以执行这些目录存储的命令,Linux下这些目录以:分隔,而mac下以空格分隔

执行非环境变量中的命令

可以采用命令的绝对路径来执行

1
/sbin/ifconfig eth0

采用命令添加

1
PATH="$PATH":命令路径    # 一般是一个bin文件目录

配置文件添加,mac下也有许多环境变量相关配置文件,可以添加语句

1
export PATH=$PATH:命令路径

使用前记得执行

1
source 配置文件名路径

注:如果有两个相同名字的命令存在PATH中,则执行PATH先查询到的目录下的命令

0x04 文件与目录管理

常见文件/目录操作命令

ls命令–查看文件与目录

1
2
3
4
5
6
7
8
9
10
11
ls [options] 目录名称
# 常用option
-a 显示全部包括隐藏文件(还显示.与..)
-d 仅列出目录本身(.)一般要搭配其他option一起使用
-l 打印表示文件属性、权限的字符串
-A 同-a ,但不列出 "." 及 ".."
-F 在列出的文件名称后加一符号标识 例如可执行档则加 "*", 目录则加 "/", sockert加"=",FIFO文件加"|"
-R 连同子目录下文件依序列出
-r 将文件以相反次序显示(原定依英文字母次序)
-t 将文件依建立时间之先后次序列出
-n 列出UID与GID

cp命令–复制

1
2
3
4
5
6
7
8
9
10
11
cp [options] source1 source2 …… destination
# 常用参数
-d 若源文件为连接文件,则复制连接属性
-p 连同文件的属性一起复制过去,而非使用默认属性(备份常用)
-r 递归持续复制
-a 相当于上面提到的三个options一起用(-pdr)
-i 若目标文件已经存在时,在覆盖时会先询问动作的进行
-u 用于更新,若destination比source旧才升级destination
-f 为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次
-l 建立硬连接
-s 复制为符号连接文件 软连接

source有两个及以上时,目标文件必须是目录

rm命令–移除

1
2
3
4
5
rm [options] 文件或目录
#常用options
-f 强制移除,忽略不存在文件,不出现警告
-i 互动模式,删除前询问
-r 递归删除
  • 删除文件名以-开头文件,由于直接删除会被系统误判为option,因此只要加上./
1
2
3
rm ./-example
#
rm -- -example
  • 没有options时,直接rm是无法删除目录的,一定要-r

    1
    rm -r 目录

mv命令–移动或更名

1
2
3
4
5
6
7
mv [options] source1 source2 …… destination
# 参数
-f 不询问直接覆盖
-i 覆盖前询问
-u 更新,source比destination新才会更新
#重命名操作
mv old_name new_name # 处于同一目录下

mv移动默认删除原文件

利用以上命令实现文件移动新目录,不删除原文件

1
2
3
4
cp source1 source1_1
cd 新路径
mkdir 新目录
mv source1_1完整路径 新目录

basename与dirname

1
2
basename 路径  # 返回文件名
dirname 路径 # 返回目录名

文件内容查阅命令

  • cat :从第一行开始
  • tac :从最后一话开始
  • nl:显示时列出行号
  • more:一页页显示
  • less:与more类似,但可以往前翻
  • head:只看头几行
  • tail:只看结尾几行
  • od:二进制方式读取

修改文件时间或创建文件–touch

三个变动时间

  • mtime :文件内容数据(不包括属性、权限)更改时更新
  • ctime :文件状态(属性权限等)改变时更新(cp时无法复制的属性)
  • atime :文件内容被取用时(如用cat读取)时更新
1
2
3
4
5
6
touch [options] 文件
-a 仅修改访问时间
-c 仅修改文件时间,若文件不存在则新建
-d 后接日期(不同于当前),同 --date="日期或时间"
-m 仅修改mtime
-t 后接时间(不同于当前),格式为[YYMMDDhhmm]

可以通过touch+文件名在当前目录下新建一个文件,注意与mkdir区分(新建目录)

也可以通过touch+文件名将文件时间(mtime、atime)修改到现在

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

文件默认权限:umask

Linux下输入会返回4个数字,与权限相关的是后三个,而mac下只返回后三个数字,而两者返回的代表权限的数字都等于默认值-权限分数

1
2
3
4
5
umask   #在~下执行,加-S会以字母形式回显 u=rwx,g=rx,o=rx
022 #回显 Linux下是0022
cd /
ls -al | grep sloth
drwxr-xr-x 5 sloth wheel 160 May 9 18:51 opt # 回显 可见权限分数是755

两种默认值

  • 新建文件时,默认值(rw-rw-rw-)为666,默认没有可执行权限,因此新建的文件权限分数为666-022=644 022为umask,可设置
  • 新建目录时,默认值(rwxrwxrwx)为777,因为x权限与进入此目录有关,因此新建的目录权限分数为777-022=755

文件隐藏属性

设置

1
2
3
4
5
6
7
8
9
chattr [+-=][ASacdistu] 文件或目录
A 设置后访问文件或目录后,atime不改变
S 设置后所有改动同步写入磁盘
a 设置后只能增加数据,root才能设置(常用)
c 设置后自动压缩
d 设置后改文件或目录不会被dump备份
i 设置后该文件不能被删除、改名、无法写入添加数据,只有root可以设置(常用)
s 设置后若被删除,会被完全从磁盘空间中删除
u 与s相反,若被删除还会保留在磁盘中,可找回

显示

1
2
3
4
lsattr [-adR] 文件或目录
-a 隐藏文件的属性也显示
-d 若操作目录,仅列出目录本身属性,不递归
-R 递归

文件特殊权限

SUID

当s出现在user权限的x位置上,e.g. -rwsr-xr-x

  • 针对文件
  • 仅对二进制程序有效
  • 执行者对于该程序要有x权限
  • 执行者在执行程序过程中暂时具有user的权限

SGID

s出现在group权限的x位置上

  • 针对文件或目录
  • 对二进制程序有用
  • 执行者对于该程序要有x权限
  • 执行者在执行程序过程中暂时具有group的权限

SBIT

  • 仅针对目录
  • 用户在该目录下创建文件或目录时,只有自己与root才有权删除该文件,也无法改动他人文件

特殊权限的设置

前面所提的权限分数都是三位数字,我们可以在设置权限分数时在开头加上代表特殊权限的第四位数字(特殊权限可叠加)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4  SUID
2 SGID
1 SBIT
chmod 4775 test1 #加上SUID
# drwsrwxr-x
chmod 7666 test2 #加上三种
# drwSrwSrwT
chmod 4666 test3
# drwSrw-rw-
chmod 6666 test4
# drwSrwSrw-
chmod 1666 test5
# drw-rw-rwT
chmod 1766 test5
# drwxrw-rwT
# 符号法
u+s #SUID
g+s #SGID
o+t #SBIT

从上面的案例可以看出,当user没有x时加上SUID会用S填充表示空,同理当group权限没有x时加SGID会用S填充表示空,而SBIT在others没有x时以T填充表示空

查看文件类型:file

1
2
3
file 文件或目录路径
# 回显
路径:格式类型信息(包括有没有使用到动态函数库等信息) (这里的路径取决于你输入命令中的路径,不一定是绝对路径)

0x06 命令与文件的查询

脚本文件名查询

1
2
which [-a] command
-a:列出所有同名命令

文件名查找

1
2
3
4
5
whereis [options] 文件或目录名
-b:只找二进制文件
-m:只找在说明文件manual路径下的文件
-s:只找source源文件
-u:除以上三种外的其他特殊文件
1
2
3
locate [options] keyword
-i:忽略大小写差异
-r:后面可接正则

find命令–磁盘中查找,时间较长,功能强大

https://wangchujiang.com/linux-command/c/find.html

时间相关参数

1
2
3
4
5
6
7
8
find [PATH] [option] [action]
# 可加与时间相关参数,下面以-mtime为例
-mtime n : n天之前的“一天内”被更改文件
-mtime +n : n天之前(不含n本身,包括往前所有时间)被更改文件
-mtime -n : n天之内(含n本身)被更改文件
-newer 文件: 列出比该文件更新的文件
#列出过去24小时内被修改文件
find / -mtime 0

用户、用户组相关参数

1
2
3
4
5
6
-uid n 
-gid n
-user name
-group name
-nouser :找出文件所有者不在/etc/passwd中的
-nogroup :找出文件所有用户组不在/etc/passwd中的

找到不属于系统任何人的文件,可能是曾经下载用于编译软件的源码

文件权限、名称相关参数

1
2
3
4
5
6
-name filename
-size [+-]SIZE :找比SIZE大(+)或小(-)的,c表示byte,k表示KB,e.g. -size +50k
-type TYPE: 正规文件(f)、设备文件(b,c)、目录(d)、连接文件(l)、socket(s)、FIFO(p)等
-perm 权限分数
-perm -mode :找出权限分数比mode大的文件 e.g. -perm -0744
-perm +mode :找出权限中包含任一mode权限的

其他参数

1
2
3
4
5
-exec command {}\;  :后接command处理查询结果,但不支持命令别名alias
-print : 打印,这是默认操作
#范例
find / -perm +7000 -exec ls -l {}\;
#将含有隐藏权限的文件找出并以ls -l方式列出来

find的结果被放入’{}’中,命令以’;‘为结束标志,因为’;’在bash下有特殊意义要转义

0x07 权限与命令间关系

用户可进入目录成为可工作目录

  • 可使用命令:cd等切换工作目录
  • 目录所需权限:至少是x
  • 额外需求:若想执行ls查阅目录内文件名,对目录还要r权限

用户读取目录内内某一文件

  • 可使用命令:cat、more、less等
  • 目录所需权限:至少是x
  • 文件所需权限:至少是r

用户修改某一文件

  • 目录所需权限:至少是x
  • 文件所需权限:至少是r、w

用户创建一个文件

  • 目录所需:至少是w、x

用户进入某目录并执行该目录下某命令

  • 目录所需权限:至少是x
  • 文件所需权限:至少是x

范例

用户能执行以下命令

1
cp /dir1/file1  /dir2
  • dir1目录:至少有x
  • file1文件:至少有r
  • dir2目录:至少有w、x

文件系统的简单操作

查看磁盘与目录的容量

df

1
2
3
4
5
6
7
8
df [options] [目录名/文件名]
-a: 列出所有,包括特有的/proc
-k: 以KB单位显示
-m: 以MB单位
-h: 自动加上单位(如显示12K)
-H: 使用M=1000K的换算
-T: 连同该分区的文件系统名称也列出
-i: 以inode数量显示
  • inode:一个文件占用一个inode,inode记录文件的属性,也记录此文件的数据所在的block号码
  • block:记录文件内容,若文件太大,会占用多个block
  • super block: 记录此文件系统的整体信息

du

1
2
3
4
5
6
7
du [options] 文件或目录名
-a: 所有
-h: 自动加上单位
-s: 列出总量
-S: 列出总量,但不包括子目录
-k: kb
-m: mb

连接文件

ln

1
2
3
ln [options] 源文件 目标文件
-s: 不加-s就是硬连接,加-s就是symbolic link
-f: 如果目标文件存在,主动将目标文件直接删除任何再创建
  • 硬连接:使得两个文件连接到同一个inode,二者除文件名以外一摸一样

    • 不能跨文件系统、不能连接到目录
  • symbolic link: 符号连接,快捷方式

    • 删除源文件,会导致目标文件打开不了
  • 标题: Linux与MAC文件、目录与磁盘格式
  • 作者: Sl0th
  • 创建于 : 2021-09-23 22:59:56
  • 更新于 : 2024-07-03 23:00:55
  • 链接: http://sl0th.top/2021/09/23/Linux与MAC文件、目录与磁盘格式/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论