简介
Linux奉行的原则是万物皆文件,所以文件的管理对于了解Linux系统十分的重要。
说明
因为Linux里面所有的东西都是文件,所以注定了文件会有不同的类型以便区分。再加上Linux是多用户系统,那么同一个的文件也注定会有不同的使用权限。使用ls -l
命令可以查看文件的一些基本信息。
上图中的格式,分别表示为:文件类型和文件属性、目录个数、所有者、所属组、文件大小、修改日期、文件名称。
文件类型
类型 | 说明 |
---|---|
- | 普通文件 |
d | 目录文件 |
l | 链接文件 |
c | 字符设备文件 |
s | 套接字文件 |
目录文件
它其实就是个存放索引的文件,存放的内容是其下文件名和这些文件的inode。
链接文件
链接文件其实指的是软链接,里面存放的就是被指向文件的路径。这和文件可以理解为一个“导航”。 当访问这个链接文件是会自动导航到其所指向的真实的文件路径,所以实际还是去访问原文件,它只是方便为了方便访问原文件。
所以如果原文件路径改变和被删除,那这个软链接就不能用了,用ls查看时此文件会变红。而如果再按路径创建个相同名称的文件,那它又能用了。
说明:有软链接,那自然说明有硬链接。硬链接是对于Linux文件系统的一个概念,因为其实所有的文件都是个索引,类似C语言的指针,而它的指针所指向的地址就是文件的inode,A文件可以指向这个inode去访问文件内容,那么创建了个硬链接B文件后,它也是指向的这个inode,所以B文件和A文件是同一等级的,而且就算删除A文件,B文件还是没有影响。
文件属性
文件属性有9个值,其中3个为一组,每组表示了所有者、所属组、其他人对于此文件拥有的读、写、执行权限。
- r: 读权限
- w: 写权限
- x: 执行权限
PS:比如编译出来了一个c程序,但如果这个程序文件对用户没有执行权限,用户是不能运行它的。
目录个数
此数字对于非目录类型的文件来说永远是1。而对于目录来说则表示此目录中有多少个子目录。因为有“.”目录和“…”目录的存在,所以就算是新创建的空目录数值也会是2。
所有者
创建此文件的用户,所有者可以被root用户修改。
所属组
创建此文件的用户所属的组,所属组也可以被root用户修改。
文件大小
表示文件占有磁盘空间的字节大小。
注意:对于目录类型的文件来说,不是其下有所有文件大小的总和,而只是它实际占有的空间大小,即索引数据。
修改日期
表示文件的最新改动的日期。
如果觉得日期格式不方便阅读,可以修改:
ll --time-style="+%Y-%m-%d %H:%M:%S"
# 设置环境变量,临时修改
export TIME_STYLE='+%Y-%m-%d %H:%M:%S'
# 若要永久修改,就把修改命令写入/etc/profile中
sudo echo "export TIME_STYLE='+%Y-%m-%d %H:%M:%S'" >> /etc/profile && source /etc/profile
文件名称
文件的名称,同一目录下就算类型不同的文件也不能重名。
大多数shell,会对不同类型的文件名赋予不同的颜色:
- 灰白色表示普通文件
- 亮绿色表示可执行文件
- 亮红色表示压缩文件
- 灰蓝色表示目录
- 亮蓝色表示链接文件
- 亮黄色表示设备文件
说明:这里表示的是系统缺省的配色方案。如果自定义了shell的配色方案,则有可能与上面的定义不一致。
操作
不同于Windows的可视化操作,Linux总是在命令行中添加、删除、复制、移动文件,当然Linux也有可视化操作,但是用于服务器的操作系统我是比较排斥使用图形化的。
创建
Linux系统对于文件名的后缀并不关心,所以不同于Windows,就算你后缀给了个.txt,但是它也可以是可执行文件。
# 创建文件
touch file.txt
touch file{1..8}.txt # 可以同时创建1到8多个文件
# 使用编辑器创建
vi file.txt
# 创建目录
mkdir text
# 创建软链接
ln -s <源文件> <目标文件> # 源文件路径最好使用绝对路径
ln <源文件> <目标文件> # 创建硬链接
删除
rm -f text.txt
# 若是目录文件则需要带上-r
rm -rf text
# 删除除以.zip结尾的所有文件
rm -f !(*.zip)
查看文件
# 正序查看
cat file.txt
cat -n file.txt # 显示行号
# 倒序查看
tac file.txt
# 从头看(默认是10行)
head -20 file.txt # 显示文件的开头100行
# 从尾看(默认是10行)
tail -20 file.txt # 显示文件的结尾100行
tail -c 10 file.txt # 显示文件file的最后10个字符
# 阅读器
more file.txt
less file.txt # less是more的升级版,命名来源于俗语“less is more”
查找文件
# 查找指令路径
which yum
whereis yum # 此命令不仅会找出指令的绝对路径,还会找到相应配置文件和帮助文档
whereis -b yum # 不找帮助文档
whereis -m yum # 只找帮助文档
# 查找文件
find / -name 'php.ini'
# 查找指定目录中符合搜索条件的文件及其内容。
# 例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容
grep -r 'update' /etc/acpi
其他操作
# 显示文件元信息
stat file.txt
# 复制文件
cp <源文件> <目标文件>
文件权限
这一块是最最重要的,当然也是比较难理解的一部分。文件的权限全体现在文件属性值上,前面只是粗略的说了一下,这里会具体说明每种权限所表示的含义。
基本权限
基本权限有读、写、执行权限。
注意:由于目录文件里面的内容是其他文件的索引,所以它的基本权限在理解上会和非目录文件有些差别。
说明
读权限
获取文件中的内容,若没有此种权限,那使用如cat
、tail
、head
、vi
等会查看内容的命令都会有Permission denied。
对于目录文件,没有读权限以上命令自然也是查看不了的(会显示Permission denied,而有读权限则会报错:Is a directory),而且在使用解读目录内容的命令如ls, 也是查看不了目录的结构。
写权限
向文件写入内容的权限。
而对于目录文件,它的内容则是里面存放的文件名及inode,因为直接打开是二进制文件,不可能直接在文件里面写内容。所以对于目录文件的写操作,即是间接更改它内容:即对其子文件的新增、删除、重命名、移动等。而对其子目录文件添加文件,以及对其子文件修改内容则不受影响,因为这并不会导致目录文件的内容改变。
执行权限
有资格去运行文件程序。
对于目录文件,它的执行就是能进入目录且能查看目录中文件的具体信息。
比如,给目录的其他人读权限,但是不给其他人执行权限,则仅会到到以下内容:
操作
前面说了文件的9个属性值表示的含义,创建文件后,默认的权限是按照umask掩码来设置的。若没有umask,则文件的默认权限为0666,文件夹的默认权限为0777。但是系统为了保护用户创建文件和文件夹的权限,此时系统会有一个默认的用户掩码(umask),大多数的Linux系统的默认掩码为0022,使用命令umask
或umask -S
可查看。用户掩码的作用是用户在创建文件时从文件的默认权限中去除掩码中的权限。所以文件创建之后的权限实际为:
默认权限(文件0666,文件夹0777) - umask
若想修改umask,则使用umask命令即可,如:umask 0000
。
当然,单独修改文件的属性值肯定是也是可以的
# 修改属性
chmod 0755 text.txt
chmod -R 0755 text # 递归修改目录中所有文件的属性
# 使用符号设置权限,a/u/g/o +/-/= rwxugo
chmod [-R] u+x,g+x,o+x file
chmod [-R] a+x file # 和上述一样,全部加上执行权限
chmod [-R] u=rwx,g=rx,o=u file # o=u,让其它人的权限和属主的权限一样
# 修改文件拥有者和所属组
chown robert:robert text.txt
chown -R robert:robert text # 递归修改目录中所有文件
特殊权限
SUID
SUID全称Set User ID,当小写字母s出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。
如, /usr/bin/passwd文件。
- 需要此文件是二进制可执行文件。
- 命令执行者要对该程序拥有执行权限。
- 在执行过程中,调用者会暂时获得该文件的所有者权限。该权限只在程序执行的过程中有效。
# 设置
chmod 4755 <文件名>
chmod u+s <文件名>
# 取消
chmod 0755 <文件名>
chmod u-s <文件名>
注意:若此处s变成大写,则表示SUID无效。
SGID
SGID全称Set Group ID,当小写字母s出现在文件用户组的执行权限位上,它对二进制可执行文件和目录都有效。
对文件:
- 需要此文件是二进制可执行文件。
- 命令执行者要对该程序拥有执行权限。
- 在执行过程中,调用者会暂时获得该文件的所属组的权限。该权限只在程序执行的过程中有效。
说明:可以看出这个设置在文件时,跟SUID基本是相同的功能。
对目录:
- 普通用户必须对此目录拥有r和x权限,才能进入此目录。
- 普通用户在此目录中的有效组会变成此目录的属组。
- 若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组。
# 设置
chmod 2755 <文件名>
chmod g+s <文件名>
# 取消
chmod 0755 <文件名>
chmod g-s <文件名>
注意:若此处s变成大写,则表示SGID无效。
SBIT
SBIT全称Sticky Bit(粘滞位),它出现在其他用户权限的执行位上,只能用来修饰一个目录。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,其他用户均不可以。如/tmp目录。
# 设置
chmod 1777 <文件名>
chmod o+t <文件名>
# 取消
chmod 0777 <文件名>
chmod o-t <文件名>
ACL权限
ACL权限就是对于某个文件或目录单独给某个用户分配一个权限,直接忽略三个基本权限。
注意:前提是该文件或目录所在的分区开启了ACL权限,目前基本都是开启了ACL权限的。
# 设置acl
# 对用户设置
# setfacl -m u:<用户名>:<权限> 文件或目录
# 对用户组设置
# setfacl -m g:<用户组>:<权限> 文件或目录
setfacl -m u:robert:wx /srv/www # 发现不给执行权限,不能用touch向www中创建文件
# 若设置成功后,会在文件的普通权限后添加上个"+"号
setfacl -Rm u:robert:wx /srv/www # 给/srv/www及其所有子目录都赋予acl
# 默认acl权限
# 如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限
setfacl -m d:u:robert:wx /srv/www
# 但此写法只会让该目录下的文件生效,若该目录下还有子目录,则在子目录中创建的目录将不会有效,故可以用以下写法
setfacl -Rm d:u:robert:wx /srv/www
# 查看acl
getfacl /srv/www
# 设置acl的mask
# 如果我给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限
# setfacl -m m:权限 文件或目录
setfacl -m m:rwx /srv/www
# 删除acl
# 删除指定用户的ACL权限
setfacl -x u:robert /srv/www
# 删除指定组的ACL权限
setfacl -x g:robert /srv/www
# 删除文件的所有ACL权限
setfacl -b /srv/www
文件系统属性权限
有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。
通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。
属性选项 | 功能 |
---|---|
i | 如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据 |
^ | 如果对目录设置 i 属性,那么只能修改目录下文件中的数据,但不允许建立和删除文件 |
a | 如果对文件设置 a 属性,那么只能在文件中増加数据,但是不能删除和修改数据 |
^ | 如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许删除文件 |
u | 设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录(数据内容其实还存在磁盘中,可以用于undeletion) |
s | 和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复 |
说明:一共有8个属性,这里仅列举出常用的4种。
# 设置attr权限
chattr +i test.txt
chattr -R +i /home/robert/secret # -R表示递归设置属性
# 查看attr权限
lsattr test.txt
PS:不知道为啥,给目录设置的时候查看不了,但是应该是设置成功了的,因为确实删不了了。