Linux命令之文件与权限管理

ext4

Linux目前使用的是ext4文件系统

ext4文件系统会把分区主要分为两大部分(暂时不提超级块):一小部分用于保存文件的inode(i节点)信息;剩余的大部分用于保存block信息。
inode的默认大小为128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的block编号。每个文件需要占用一个inode。

inode中是不记录文件名的,那是因为文件名记录在文件所在目录的block中。

也就是说,目录的block中记录的是这个目录下所有一级子文件和子目录的文件名及inode的对应;而文件的block中记录的才是文件实际的数据。

当我们查找一个文件,比如/root/test时,要经过以下步骤:
●首先找到根目录的inode(根目录的inode是系统已知的,inode号是2),然后判断用户是否有权限访问根目录的block。
●如果有权限,则可以在根目录的block中访问到/root/的文件名及对应的inode号。
●通过/root/目录的inode号,可以查找到/root/目录的inode信息,接着判断用户是否有权限访问/root/目录的block。
●如果有权限,则可以从/root/目录的block中读取到test文件的文件名及对应的inode号。
●通过test文件的inode号,就可以找到test文件的inode信息,接着判断用户是否有权限访问test文件的block。
●如果有权限,则可以读取block中的数据,这样就完成了/root/test文件的读取与访问。

命令提示符

[root@localhost ~]#

  • root:显示的是当前的登录用户
  • localhost:当前系统的简写主机名
  • ~:代表用户当前所在的目录
  • #:命令提示符,Linux用这个符号标识登录的用户权限等级。如果是超级用户,提示符就是#;如果是普通用户,提示符就是$
  • 超级用户的家目录:/root/。普通用户的家目录:/home/用户名/。

[root@localhost ~]# 命令 [选项] [参数]
命令的选项用于调整命令功能,而命令的参数是这个命令的操作对象。

目录操作命令

ls

选项:

-a: 显示所有文件

–color=when: 支持颜色输出,when的值默认是always(总显示颜色),也可以是never(从不显示颜色)和auto(自动)

-d: 显示目录信息,而不是目录下的文件

-h: 人性化显示,按照我们习惯的单位显示文件大小

-i: 显示文件的i节点号

-l: 长格式显示

-a选项中的a是all的意思,也就是显示隐藏文件,以“.”开头的文件是隐藏文件,隐藏文件不是为了把文件藏起来不让其他用户找到,而是为了告诉用户这些文件都是重要的系统文件,如非必要,不要乱动

“-l”选项用于显示文件的详细信息,“ll”等同于“ls -l”:
●第一列:权限。
●第二列:引用计数。文件的引用计数代表该文件的硬链接个数,而目录的引用计数代表该目录有多少个一级子目录。
●第三列:所有者,也就是这个文件属于哪个用户。默认所有者是文件的建立用户
●第四列:所属组。默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组。
●第五列:大小。默认单位是字节。
●第六列:文件修改时间。文件状态修改时间或文件数据修改时间都会更改这个时间,注意这个时间不是文件的创建时间。
●第七列:文件名。

“ls -l”显示的文件大小是字节,但是我们更加习惯的是千字节用KB显示,兆字节用MB显示,而“-h”选项就是按照人们习惯的单位显示文件大小的

每个文件都有一个被称作inode(i节点)的隐藏属性,可以看成系统搜索这个文件的ID,而“-i”选项就是用来查看文件的inode号的

cd

-P (大写)是指如果切换的目录是软链接目录,则进入其原始的物理目录,而不是进入软链接目录;-L(大写)是指如果切换的目录是软链接目录,则直接进入软链接目录。

“cd ~”命令可以快速回到用户的家目录,cd命令直接按回车键也是快速切换到家目录。

pwd是查看当前所在目录的命令

如果路径是从根目录开始,一级一级指定的,那使用的就是绝对路径。所谓相对路径,就是只从当前所在目录开始,切换目录。

mkdir

如果需要建立一系列的新目录,则需要加入“-p”选项,递归建立才可以

rmdir

既然可以递归建立目录,当然也可以加入“-p”选项递归删除目录。

但rmdir命令的作用十分有限,因为只能删除空目录,所以一旦目录中有内容,就会报错。删除文件或目录更多的使用rm命令

tree

以树形结构显示目录下的文件
apt install tree 安装

文件操作命令

touch

修改文件的时间戳。如果文件不存在,则会建立空文件;如果文件已经存在,则会修改文件的时间戳(访问时间、数据修改时间、状态修改时间都会改变)。千万不要把touch命令当成新建文件的命令

选项:

-a: 只修改文件的访问时间(Access Time)

-c: 如果文件不存在,则不建立新文件

-d: 把文件的时间改为指定的时间

-m: 只修改文件的数据修改时间(Modify Time)

Linux中的每个文件都有三个时间,分别是访问时间(Access Time)、数据修改时间(Modify Time)和状态修改时间(Change Time)。这三个时间可以通过stat命令来进行查看。不过touch命令只能手工指定是只修改访问时间,还是只修改数据修改时间,而不能指定只修改状态修改时间。因为不论是修改访问时间,还是修改文件的数据时间,对文件来讲,状态都会发生改变,所以状态修改时间会随之改变。
注意:在Linux中,文件没有创建时间。

stat

stat是查看文件详细信息的命令
选项:

-f: 查看文件所在的文件系统信息,而不是查看文件的信息


注意观察各项命令会使哪些时间发生变化

修改文件内容,使用“echo 9527>> test”(这条命令会向test文件末尾追加一行“9527”数据)

cat

concatenate(连接、连续)的简写,合并文件并打印输出到标准输出。不论文件内容有多少,都会一次性显示。
选项:

-A: 相当于-vET选项的整合,用于列出所有隐藏符号

-E: 列出每行结尾的回车符$

-n: 显示行号

-T: 把Tab键用^I显示出来

-v: 列出特殊字

tac

从最后一行开始显示内容,并把所有内容输出

more

分屏显示文件内容。如果文件过大,则cat命令会有心无力,这时more命令的作用更加明显。

常用的交互命令如下
●空格键:向下翻页。
●b:向上翻页。
●回车键:向下滚动一行。
●/字符串:搜索指定的字符串。
●q:退出。

less

分行显示文件内容。可以使用上、下箭头

显示文件开头的内容。默认显示文件的开头10行内容。
选项:

-n 行数: 从文件头开始,显示指定行数

-v: 显示文件名

tail

显示文件结尾的内容。
选项:

-n 行数: 从文件结尾开始,显示指定行数

-f: 监听文件的新增内容, 光标不会退出命令,而会一直监听在文件的结尾处,等待显示新增内容。

ln

在文件之间建立链接。
[root@localhost ~]# ln [选项] 源文件 目标文件
选项:

-s: 建立软链接文件。如果不加“-s”选项,则建立硬链接文件

-f: 强制。如果目标文件已经存在,则删除目标文件后再建立链接文件

软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。

硬链接

源文件和硬链接文件的inode号是一样的

硬链接的特点如下:
●不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变。
●不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。
●硬链接不会建立新的inode信息,也不会更改inode的总数。
●硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode号是重新计算的。
●硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的Linux来讲过于复杂。

软链接

软链接和源文件的inode号是不一致的

软链接的标志非常明显,首先,权限位中“l”表示这是一个软链接文件;其次,在文件的后面通过“->”显示出源文件的完整名字。

软链接的特点(软链接的特点和Windows中的快捷方式完全一致)。
●不论是修改源文件(check),还是修改软链接文件(check-soft),另一个文件中的数据都会发生改变。
●删除软链接文件,源文件不受影响。而删除源文件,软链接文件将找不到实际的数据,从而显示文件不存在。
●软链接会新建自己的inode信息和block,只是在block中不存储实际文件数据,而存储的是源文件的文件名及inode号。
●软链接可以链接目录。
●软链接可以跨分区。

目录和文件都能操作的命令

rm

删除文件或目录。
选项:

-f: 强制删除(force)

-i: 交互删除,在删除之前会询问用户

-r: 递归删除,可以删除目录(recursive)
数据强制删除之后无法恢复,除非依赖第三方的数据恢复工具,如extundelete等。但要注意,数据恢复很难恢复完整的数据,一般能恢复70%~80%就很难得了。

cp

复制文件和目录。

[root@localhost ~]# cp [选项] 源文件 目标文件
选项:

-a: 相当于-dpr选项的集合

-d: 如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接, 不加“-d”选项,实际复制的是软链接的源文件

-i: 询问,如果目标文件已经存在,则会询问是否覆盖, 默认执行

-l: 把目标文件建立为源文件的硬链接文件,而不是复制源文件

-s: 把目标文件建立为源文件的软链接文件,而不是复制源文件

-p: 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间)当我们在执行数据备份、日志备份的时候,这些文件的时间可能是一个重要的参数,这就需要执行“-p”选项了。

-r: 递归复制,用于复制目录

mv

移动文件或改名。
[root@localhost ~]# mv [选项] 源文件 目标文件
选项:

-f: 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖

-i: 交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项)

-n: 如果目标文件已经存在,则不会覆盖移动,而且不询问用户

-v: 显示详细信息

权限管理命令


文件类型
-“-”:普通文件。
-“b”:块设备文件。这是一种特殊设备文件,存储设备都是这种文件,如分区文件/dev/sda1就是这种文件。
-“c”:字符设备文件。这也是特殊设备文件,输入设备一般都是这种文件,如鼠标、键盘等。
-“d”:目录文件。Linux中一切皆文件,所以目录也是文件的一种。
-“l”:软链接文件。
-“p”:管道符文件。这是一种非常少见的特殊设备文件。
-“s”:套接字文件。这也是一种特殊设备文件,一些服务支持Socket访问,就会产生这样的文件。

所有者的权限

  • r:代表read,是读取权限。
  • w:代表write,是写权限。
  • x:代表execute,是执行权限。
    如果有字母,则代表拥有对应的权限;如果是“-”,则代表没有对应的权限。

如果在文件的权限位中含有“.”,则表示这个文件受SELinux的安全规则管理。

chmod

修改文件的权限模式。
[root@localhost ~]# chmod [选项] 权限模式 文件名
选项:

-R: 递归设置权限,也就是给子目录中的所有文件设定权限
权限模式的格式是[ugoa][[+-=][perms]],也就是[用户身份][[赋予方式][权限]]

用户身份

  • u:代表所有者(user)。
  • g:代表所属组(group)。
  • o:代表其他人(other)。
  • a:代表全部身份(all)。

赋予方式

  • +:加入权限。
  • -:减去权限。
  • =:设置权限。

权限

  • r:读取权限(read)4 可以对文件执行cat、more、less、head、tail等文件查看命令。可以在目录下执行ls命令
  • w:写权限(write)2 可以对文件执行vim、echo等修改文件数据的命令。注意:因为文件名保留在上级目录的block中,所以对文件拥有写权限,是不能删除文件本身的,而只能删除文件中的数据(也就是文件block中的内容)。要想删除文件名,需要对文件所在目录拥有写权限。 可以在目录下执行touch、rm、cp、mv命令。对目录来说,写(w)权限是最高权限。
  • x:执行权限(execute)1 对文件来说,执行(x)权限是最高权限。可以对目录执行cd命令

数字权限的赋予方式更加简单
●644:这是文件的基本权限,代表所有者拥有读、写权限,而所属组和其他人拥有只读权限。
●755:这是文件的执行权限和目录的基本权限,代表所有者拥有读、写和执行权限,而所属组和其他人拥有读和执行权限。
●777:这是最大权限。在实际的生产服务器中,要尽力避免给文件或目录赋予这样的权限,这会造成一定的安全隐患。

创建普通用户user的简单步骤:第一步,添加用户执行命令“useradd user”;第二步,设置用户密码“passwd user”,输入两次密码确认。执行命令“su – user”切换用户

chown

修改文件和目录的所有者和所属组。
[root@localhost ~]# chown [选项] 所有者:所属组 文件或目录
选项:

-R: 递归设置权限,也就是给子目录中的所有文件设置权限

文件的所有者,才可以修改文件的权限。
在Linux中,每个用户建立之后,都会建立和用户名同名的用户组,作为这个用户的初始组,user用户组是自动建立的。

chgrp

修改文件和目录的所属组

umask

在Linux中,通过umask默认权限来给所有新建立的文件和目录赋予初始权限,这一点和Windows不太一样,Windows是通过继承上级目录的权限来给文件和目录赋予初始权限的。

使用“-S”选项,会直接用字母来表示文件和目录的初始权限。

对文件来讲,新建文件的默认最大权限是666,没有执行(x)权限。这是因为执行权限对文件来讲比较危险,不能在新建文件的时候默认赋予,而必须通过用户手工赋予。换算成字母就是“-rw-rw-rw-”;而umask的值是022,也换算成字母就是“—–w–w-”。把两个字母权限相减,得到的就是新建文件的默认权限:(-rw-rw-rw-)-(—–w–w-)=(-rw-r–r–)。
对目录来讲,新建目录的默认最大权限是777。这是因为对目录而言,执行(x)权限仅仅代表进入目录,所以即使建立新文件时直接默认赋予,也没有什么危险。换算成字母就是“drwxrwxrwx”;而umask的值是022,也换算成字母就是“d—-w–w-”。也把两个字母权限相减,得到的就是新建目录的默认权限:(drwxrwxrwx)-(d—-w–w-)=(drwx-r-xr-x)。

umask默认权限可以直接通过命令来进行修改, 如umask 033,不过,通过命令进行的修改只能临时生效,一旦重启或重新登录就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件/etc/profile。

帮助命令

man

显示联机帮助手册。
man [选项] 命令
选项:
-f: 查看命令拥有哪个级别的帮助
-k: 查看和命令相关的所有帮助


man命令的快捷键


man命令的帮助级别


●whatis:这个命令的作用和man -f是一致的。
●apropos:这个命令的作用和man -k是一致的。

Linux的命令很有意思,想知道这个命令是干什么的,可以执行whatis命令;想知道命令在哪里,可以执行whereis命令;想知道当前登录用户是谁,可以执行whoami命令。

info

info命令的帮助信息是一套完整的资料, 每个命令的帮助信息都会和书籍一样,拥有章节编号。

help

能获取Shell内置命令的帮助,但在Linux中绝大多数命令是外部命令,所以help命令的作用非常有限。

–help

绝大多数命令都可以使用“–help”选项来查看帮助,输出的帮助信息基本上是man命令的信息简要版。

搜索命令

whereis

查找二进制命令、源文件和帮助文档的命令。whereis命令不能搜索普通文件,而只能搜索系统命令。

选项:
-b: 只查找二进制命令
-m: 只查找帮助文档

which

列出命令的所在路径。和whereis命令的区别在于,whereis命令可以在查找到二进制命令的同时,查找到帮助文档的位置;而which命令在查找到二进制命令的同时,如果这个命令有别名,则还可以找到别名命令。

locate

按照文件名搜索文件。系统命令其实也是文件,也可以按照文件名来搜索系统命令。不能执行更复杂的搜索,比如按照权限、大小、修改时间等搜索文件。
选项:
-i: 忽略大小写

搜索速度非常快,而且耗费系统资源非常小。这是因为locate命令不会直接搜索硬盘空间,而会先建立locate数据库,然后在数据库中按照文件名进行搜索,是快速的搜索命令。缺点是数据库不是实时更新的,而要等用户退出登录或重启系统时,locate数据库才会更新,所以我们无法查找到新建立的文件。
可以通过updatedb命令来手工更新这个数据。

同时,在locate执行搜索时,系统认为某些文件系统、某些文件类型和某些目录是没有搜索必要的,比如光盘、网盘、临时目录等,所以如/tmp/目录下的文件会被忽略

find

find是Linux中强大的搜索命令,不仅可以按照文件名搜索文件,还可以按照权限、大小、时间、inode号等来搜索文件。但是find命令是直接在硬盘中进行搜索的,如果指定的搜索范围过大,find命令就会消耗较大的系统资源,导致服务器压力过大。所以,在使用find命令搜索时,不要指定过大的搜索范围。

find 搜索路径 [选项] 搜索内容
选项:
-name: 按照文件名搜索,搜索的文件名必须和搜索内容一致才能找到。即find命令是完全匹配的
-iname: 按照文件名搜索,不区分文件名大小写
-inum: 按照inode号搜索
-size [+-]大小: 按照指定大小搜索文件。千字节必须是小写的“k”,而兆字节必须是大写的“M”。按照字节搜索,则需要加搜索单位“c”。
-atime [+-]时间: 按照文件访问时间搜索。如“-5”指的是5天内修改的文件,“5”指的是前5~6天那一天修改的文件,“+5”指的是6天前修改的文件。
-mtime [+-]时间: 按照文件数据修改时间搜索
-ctime [+-]时间: 按照文件状态修改时间搜索
-perm 权限模式: 查找文件权限刚好等于“权限模式”的文件
-perm -权限模式:查找文件权限全部包含“权限模式”的文件
-perm +权限模式:查找文件权限包含“权限模式”的任意一个权限的文件
-uid 用户ID: 按照用户ID查找所有者是指定ID的文件
-gid 组ID: 按照用户组ID查找所属组是指定ID的文件
-user 用户名: 按照用户名查找所有者是指定用户的文件
-group 组名: 按照组名查找所属组是指定用户组的文件
-nouser: 查找没有所有者的文件,主要用于查找垃圾文件。比如手工源码包安装的文件
-type d: 查找目录
-type f: 查找普通文件
-type l: 查找软链接文件
-a: and逻辑与 如find . -size +2k -a -type f
-o: or逻辑或
-not: not逻辑非

-exec选项
find 搜索路径 [选项] 搜索内容 -exec 命令2 {} \;
“{}”和“\; ”是标准格式,只要执行“-exec”选项,这两个符号必须完整输入。其次,这个选项的作用其实是把find命令的结果交给由“-exec”调用的命令2来处理。“{}”就代表find命令的查找结果。
find . -perm 444 -exec ls -l {} \;使用“-exec”选项,把find命令的结果直接交给“ls -l”命令处理

-ok”选项和“-exec”选项的作用基本一致,区别在于:“-exec”的命令2会直接处理,而不询问;“-ok”的命令2在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行。