Linux与MAC文件、目录与磁盘格式
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 | ls -al # 可以查看该目录下所有文件包括隐藏文件(.开头) |
表示为文件权限的字符串由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
4chmod [-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的读写权限(目前还未发现可以加入执行权限的文件类别),递归选项隐藏在左下角💡mac终端使用小技巧:直接将文件拖入终端会转换成绝对路径(不带引号)
终端切换root用户权限
1 | 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,显示隐藏文件夹后可以看见完整结构
可以发现大部分文件都与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 | cd 目录的绝对路径/相对路径 # 切换目录 change directory |
环境变量$PATH
$PATH的值一般是多个目录下的集合,当前用户可以执行这些目录存储的命令,Linux下这些目录以:
分隔,而mac下以空格分隔
执行非环境变量中的命令
可以采用命令的绝对路径来执行
1 | /sbin/ifconfig eth0 |
采用命令添加
1 | PATH="$PATH":命令路径 # 一般是一个bin文件目录 |
配置文件添加,mac下也有许多环境变量相关配置文件,可以添加语句
1 | export PATH=$PATH:命令路径 |
使用前记得执行
1 source 配置文件名路径注:如果有两个相同名字的命令存在PATH中,则执行PATH先查询到的目录下的命令
0x04 文件与目录管理
常见文件/目录操作命令
ls命令–查看文件与目录
1 | ls [options] 目录名称 |
cp命令–复制
1 | cp [options] source1 source2 …… destination |
source有两个及以上时,目标文件必须是目录
rm命令–移除
1 | rm [options] 文件或目录 |
- 删除文件名以
-
开头文件,由于直接删除会被系统误判为option,因此只要加上./
1
2
3 rm ./-example
或
rm -- -example
没有options时,直接rm是无法删除目录的,一定要-r
1 rm -r 目录
mv命令–移动或更名
1 | mv [options] source1 source2 …… destination |
mv移动默认删除原文件
利用以上命令实现文件移动新目录,不删除原文件
1 | cp source1 source1_1 |
basename与dirname
1 | basename 路径 # 返回文件名 |
文件内容查阅命令
- cat :从第一行开始
- tac :从最后一话开始
- nl:显示时列出行号
- more:一页页显示
- less:与more类似,但可以往前翻
- head:只看头几行
- tail:只看结尾几行
- od:二进制方式读取
修改文件时间或创建文件–touch
三个变动时间
- mtime :文件内容数据(不包括属性、权限)更改时更新
- ctime :文件状态(属性权限等)改变时更新(cp时无法复制的属性)
- atime :文件内容被取用时(如用cat读取)时更新
1 | touch [options] 文件 |
可以通过
touch+文件名
在当前目录下新建一个文件,注意与mkdir区分(新建目录)也可以通过
touch+文件名
将文件时间(mtime、atime)修改到现在
0x05 文件与目录的默认权限与隐藏权限
文件默认权限:umask
Linux下输入会返回4个数字,与权限相关的是后三个,而mac下只返回后三个数字,而两者返回的代表权限的数字都等于默认值-权限分数
1 | umask #在~下执行,加-S会以字母形式回显 u=rwx,g=rx,o=rx |
两种默认值
- 新建文件时,默认值(rw-rw-rw-)为666,默认没有可执行权限,因此新建的文件权限分数为
666-022=644
022
为umask,可设置 - 新建目录时,默认值(rwxrwxrwx)为777,因为x权限与进入此目录有关,因此新建的目录权限分数为
777-022=755
文件隐藏属性
设置
1 | chattr [+-=][ASacdistu] 文件或目录 |
显示
1 | lsattr [-adR] 文件或目录 |
文件特殊权限
SUID
当s出现在user权限的x位置上,e.g. -rwsr-xr-x
- 针对文件
- 仅对二进制程序有效
- 执行者对于该程序要有x权限
- 执行者在执行程序过程中暂时具有user的权限
SGID
s出现在group权限的x位置上
- 针对文件或目录
- 对二进制程序有用
- 执行者对于该程序要有x权限
- 执行者在执行程序过程中暂时具有group的权限
SBIT
- 仅针对目录
- 用户在该目录下创建文件或目录时,只有自己与root才有权删除该文件,也无法改动他人文件
特殊权限的设置
前面所提的权限分数都是三位数字,我们可以在设置权限分数时在开头加上代表特殊权限的第四位数字(特殊权限可叠加)
1 | 4 SUID |
从上面的案例可以看出,当user没有x时加上SUID会用S填充表示空,同理当group权限没有x时加SGID会用S填充表示空,而SBIT在others没有x时以T填充表示空
查看文件类型:file
1 | file 文件或目录路径 |
0x06 命令与文件的查询
脚本文件名查询
1 | which [-a] command |
文件名查找
1 | whereis [options] 文件或目录名 |
1 | locate [options] keyword |
find命令–磁盘中查找,时间较长,功能强大
https://wangchujiang.com/linux-command/c/find.html
时间相关参数
1 | find [PATH] [option] [action] |
用户、用户组相关参数
1 | -uid n |
找到不属于系统任何人的文件,可能是曾经下载用于编译软件的源码
文件权限、名称相关参数
1 | -name filename |
其他参数
1 | -exec command {}\; :后接command处理查询结果,但不支持命令别名alias |
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 | df [options] [目录名/文件名] |
- inode:一个文件占用一个inode,inode记录文件的属性,也记录此文件的数据所在的block号码
- block:记录文件内容,若文件太大,会占用多个block
- super block: 记录此文件系统的整体信息
du
1 | du [options] 文件或目录名 |
连接文件
ln
1 | ln [options] 源文件 目标文件 |
硬连接:使得两个文件连接到同一个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 进行许可。