写在前面
linux是一个多用户、多任务系统,具有很好的稳定性和安全性,而这与linux的用户和权限管理机制密不可分。
我们在linux系统中的操作,实际上都是操作进程访问文件,这里的访问权限是基于Linux的安全管理机制的。linux上最初的安全模型,叫做DAC,Discretionary Access Contorl,主动访问控制;后来在此基础上又增加了额外的权限管理机制,成为MAC,Mandatory Access Contorl,强制访问机制。为了区分两者,将支持MAC的linux系统成为selinux,意思是linux的安全加强系统。
在实际运行过程中,系统会先做DAC检查,如不通过则拒绝执行;如果通过DAC检查且支持MAC模块,则再做MAC检查。
这则笔记分为文件系统和用户管理两个部分进行整理。
linux的文件系统
在linux当中,一切都是文件。使用ll [filename]
或者 ls -l [filename/dirname]
查看文件类型。
linux文件系统构成
linux文件目录结构:
常用文件类型:
文件类型 | 描述 | 说明 |
---|---|---|
- | 普通文件,包括文本文件 | 可用touch命令创建 |
d | 文件目录 | 可用 mkdir 命令创建 |
l | 链接文件(指向另一个文件,类似于windows下的快捷方式) | 可用ln 命令创建 |
s | 套接字文件,用于进程通信 | 一般由应用程序在执行过程中创建 |
b | 块设备文件,二进制文件 | |
c | 字符设备文件,如鼠标、键盘、终端 | |
p | 管道文件 | 可用mkfifo命令创建 |
普通文件:
一般类型的文件,主要包括:
纯文本档
ASCII
:文件内容可以直接读到数据,例如:字母,数字等。这里文件可以用cat
命令进行查看。二进制文件
binary
:Linux当中可执行文件就是属于这种格式。例如,ls、 rm、mkdir 等等常见命令。数据文件
data
:有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件。例如,系统登录数据会记录在/var/log/wtmp
,这就是一个数据文件,可以用last -f /var/log/wtmp
命令查看。
目录 directory
:
跟windows
下的文件夹类似,用 ll
命令查看属性的第一个字母为d
链接文件 link file
类似Windows
系统底下的快捷方式! 第一个属性为l
,分为软链接和硬链接,这个上一则笔记已经整理过了,下面会专门讲到。
设备文件 device
区块设备文件
block
:就是一些储存数据, 以提供系统随机存取的接口设备,第一个属性为b
。例如,硬盘、软盘等。字符设备文件
character
:串行端口的接口设备,第一个属性为c
。例如,键盘、鼠标等。
Linux 常用文件后缀名
注意:与Windows系统不同,在Linux系统下, 一个文件是否能够被执行,关键是看有没有x 权限,与文件的后缀名无关。
这里的后缀名,仅仅是为了让我们便于区分,习惯在定义文件名是加上一个后缀名。
常见的文件后缀名包括:
.sh
: shell脚本或批处理文件 (scripts)。.tar
,.tar.gz
, .zip
,.tgz
: 经过打包的压缩文件。之所以有这么多后缀名,是对应不同的压缩软件,比如gunzip, tar 等。.conf
:系统的配置文件。.pl
:perl语言文件,通过perl语言开发的程序。.html
,.htm
,.php
,.jsp
:网页文件。.py
:Python语言文件,通过Python语言开发的程序。.rpm
:rpm安装的文件。
创建删除文件目录
mkdir 命令:创建文件夹
命令格式:mkdir [参数] [文件目录]
-m 设置文件权限
1 | mkdir -m 777 test3 //输入 |
-p 新建一个目录串
1 | mkdir -p /test1/test2 |
-v 创建新目录都显示信息
1 | mkdir -v /test3 |
在指定目录下创建多个目录(使用绝对路径)
rmdir 命令:删除目录
跟mkdir 相反,rmdir表示删除目录。命令格式为:mkdir [参数] [文件目录]
。这个命令的特点在于,只能删除空目录;即使加了 -p 参数,也只能删除一串空目录。如果目录当中有文件,这个命令就没有用了。
touch 命令:创建文件
命令行格式: touch [参数] [filename]
选项 | 命令行格式 | 作用 |
---|---|---|
-a | touch -a file |
改变档案的访问时间记录。 |
-d | touch -d time file |
设定时间与日期,可以使用各种不同的格式。 |
-m | touch -m file |
改变档案的修改时间记录。 |
-r | touch -r file1 file2 |
使用参考文档的时间记录。 |
-t | touch -t time file |
设定档案的时间记录,格式与 date 指令相同。 |
示例:
1 | // 在当前目录创建 test.txt 文件 |
rm命令:删除文件或目录
用来删除文件或文件目录。命令格式为:
1 | rm [参数] [文件] |
常用参数 | 含义 |
---|---|
-f | –force 忽略不存在的文件,从不给出提示。 |
-i | –interactive 进行交互式删除 |
-r | –recursive,将参数中列出的全部目录和子目录均递归地删除。 |
注意:
- 如果要删除非空目录,需要使用
rm -rf [文件目录]
- 千万不要
rm -rf /
,一旦输入这个命令,然后就没有然后了。
拓展:如何同时创建多个文件/目录
- 创建多个文件
1 | [root@steve test]# touch {1..5}.txt |
- 创建多个目录
1 | [root@steve test]# mkdir dir{1..5} |
查看文件命令
cat
和 tac
1 | cat <filename> |
cat
:一次性显示整个文件内容
tac
:跟cat类似,只不过cat 是从前往后(第一行 => 最后一行),tac是从后往前(最后一行 => 第一行)。
常用参数:
参数名称 | 作用 |
---|---|
cat -n |
-n 表示显示行号 |
cat -A |
-A 表示显示所有内容 |
head
和 tail
这两个命令比前一组命令强的地方在于,如果文件的内容比较多,而你只需要查询文件开头或者结尾,使用这两条命令会轻松很多。
常见用法:
1 | head -n 10 <filename> //显示文件开头十行 |
注意:
上述示例中n
可以省略,直接写成head -10 <filename>
,效果也是一样的;
如果-n
省略,默认显示10行内容。
tail特殊用法:
1 | tail -f <filename> |
注:加 -f 参数,动态显示文件最后10行内容,在做日志监控的时候,可以方便直观的查看变化。
1 | tail -f /var/log/messages |
more
和less
这两个命令比head
和 tail
更高级,使用起来也更加方便,能够一页一页地方便使用者逐页阅读。
more 的用法
1 | more <参数> <filename> |
常用参数:
参数名称 | 作用 |
---|---|
d | 在每屏的底部显示友好的提示信息 |
l | 忽略 Ctrl+l (换页符)。如果没有给出这个选项,则more命令在显示了一个包含有 Ctrl+l 字符的行后将暂停显示,并等待接收命令。 |
f | 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上) |
p | 显示下一屏之前先清屏。 |
c | 从顶部清屏然后显示。 |
s | 文件中连续的空白行压缩成一个空白行显示。 |
u | 不显示下划线 |
/ | 先搜索字符串,然后从字符串之后显示 |
常用操作命令
操作命令 | 作用 |
---|---|
Enter | 向下n行,需要定义。默认为1行 |
Ctrl+F | 向下滚动一屏 |
space | 向下滚动一屏 |
Ctrl+B | 返回上一屏 |
= | 输出当前行的行号 |
:f | 输出文件名和当前行的行号 |
v | 调用vi编辑器 |
! | 调用Shell,并执行命令 |
q | 退出more |
less命令
1 | less <参数> <filename> |
常用参数:
参数名称 | 作用 |
---|---|
b | 设置缓冲区的大小 |
e | 当文件显示结束后,自动离开 |
f | 强迫打开特殊文件,例如外围设备代号、目录和二进制文件 |
g | 只标志最后搜索的关键词 |
i | 忽略搜索时的大小写 |
m | 显示类似more命令的百分比 |
常用操作
参数名称 | 作用 |
---|---|
space | 翻页 |
j | 光标向下移动一行 |
k | 光标向上移动一行 |
/ | 按下 / 后输入关键词enter 即可搜索,查看多个搜索结果时,按n进行切换。 |
? | 与 / 作用类似,不同之处在于/ 当千行向下搜索,? 是当前行向上搜索。 |
搜索文件
find
命令搜索文件
注:find是常用命令,需要熟练掌握。
命令行格式: find [路径] [参数] -print
上述命令可以简单地理解为find + 限定条件
通过限定条件来查找所需的文件。-print
将匹配的文件输出到标准输出,可省略。
- 结合路径进行搜索
路径,此选项可省略,指的是查找的目录路径,比如要在home
目录下找某个文件,就是/home
;需要在etc
目录下找某个配置文件,就是 /etc
。
- 查找$HOME目录中的文件
1 | find ~ -name "*" // ~ 表示家目录 |
- 在当前目录及子目录中查找所有的‘ *.log‘文件
1 | find . -name "*.log" //. 表示当前目录;*是通配符,表示任意字符 |
- 在当前目录及子目录中查找文件名以一个大写字母开头的文件
1 | find . -name "[A-Z]*" |
-name
按照文件名查找文件
1 | find . -name [filename] |
-type
按照文件类型查找文件
1 | find . -type [filename] |
-time -n/+n
按照文件的更改时间来查找文件
文件的inode当中,有三个时间time 信息,分别是:
atime:Access time
,在读取文件或者执行文件时更改,即文件最后一次被读取的时间。查看atime,使用 ls -lu filename
mtime:Modified time
,在写入文件时随文件内容的更改而更改,是指文件内容最后一次被修改的时间。查看atime,使用ls -l filename
ctime:Change time
,在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。查看atime,使用 ls -lc filename
后面的 n 表示天数,比如 -atime +n/-n 表示访问或者执行时间大于或小于n天的条件。
-perm
按照文件权限来查找文件
1 | find . -perm 755 –print //在当前目录下查找文件权限位为755的文件 |
-user
按照文件属主来查找文件
1 | find ~ -user sam –print //在$HOME目录中查找文件属主为sam的文件 |
which 查询可执行文件的绝对路径
命令行格式: which [filename]
whereis 查找文件
命令行格式: whereis [参数] [filename]
参数 | 含义 |
---|---|
-b | 只查找二进位制文件 |
-m | 只查找帮助文件(man 目录下的文件) |
-s | 只查找代码文件 |
locate 查找文件
跟whereis 作用类似,通过查找预先生产的文件列表库来查找文件。
locate
命令 需要单独安装,
1 | yum -y install mlocate |
安装完成后,初次使用需要生产文件列表库
1 | updatedb |
查找文件
1 | locate [filename] |
注:默认情况下,数据库每周更新一次;如果一个文件正在两次更新时间段之间的创建的,就搜不到结果。
文件路径
相对路径和绝对路径
顾名思义,文件路径就是用来描述存放文件的地方。这里有两种描述的方法:
- 绝对路径:从根目录写起的,叫做绝对路径,比如
/var/...
或者~/...
- 相对路径:与当前目录相对的写法,叫做相对路径。
举例来说:
pwd //查询当前所在的绝对路径
上图中,红框标示出来的部分,就是当前所在的绝对路径,即 /Users/stevey/documents/github-file
,通过 ls 命令可以看到,下面有一个 steveBlog 的文件夹。
要进入这个文件夹可以采用两种方法:
1 | cd steveBlog //相对路径 |
文件路径相关的命令
tree
命令查看目录结构
tree命令是以树状形式显示目录下的文件或子目录;系统默认没有的,需要自行安装。
- 安装
1 | yum install -y tree |
- 命令格式
1 | //n表示目录层级数 |
- 使用
1 | //-L 表示查看目录层级,2表示查看两级目录。 |
ls
命令查看目录信息
名称 | 作用 |
---|---|
ls | 列出当前目录下的文件和文件夹,不包括隐藏文件 |
ls -a | 列出当前目录下的文件和文件夹,不包括隐藏文件 |
ls -l | 列出除隐藏文件之外的所有文件和目录的详细信息,包括权限、所属主、所属组、文件创建日期时间 |
ls <filename> -l |
查看某个文件的详细信息 |
ls <file-Folder-name> |
查看指定目录下的文件和目录 |
ls -Rl | 显示当前目录及所有子目录信息 |
ls -tl | 以时间排序显示目录,查找最新文件有用 |
ls -Sl | 以文件大小排序 |
ls -s -l -S | 显示文件大小,并按大小排序 |
示例:
pwd 命令:显示当前目录绝对路径
用于显示当前所在目录。在linux系统中, .
表示当前目录, ..
表示上一级目录。
示例:
1 | [root@VM_0_7_centos ~]# pwd |
cd 命令:切换目录
名称 | 作用 |
---|---|
cd | 返回用户主目录 |
cd /etc | 改变到其它路径 |
cd .. | 返回到上一级目录 |
cd / 或 cd ~ | 返回到根目录 |
cd - | 返回之前的目录 |
alias 命令
alias 命令用来设置指令别名,如果命令过长,那么就考虑可以设置一个别名。
命令行格式:
1 | alias 新的命令='原命令 -选项/参数' |
示例:
- 显示当前已设置的别名
1 | alias |
- 设置vim别名
1 | // 设置别名,输入`vi` 调用 `vim` |
- 删除别名
1 | unalias vi |
- 查询
alias
更多用法
1 | man alias //按 `space `下翻页,按` q `退出。 |
cp 命令:文件复制
命令格式为 cp [参数] [源文件] [目标文件]
,常见参数用法:
-r
复制目录及目录内的所有项目
-i
覆盖前询问
mv 命令:移动或重命名
命令格式为 mv [参数] [源文件或目录] [目标文件或目录]
,常见用法如下:
- 目标是目录,且目录已存在
- 目标是目录,但该目录不存在(实际相当于给文件重命名)
- 目标是文件,且该文件已存在(实际相当于覆盖目标文件)
- 目标是文件,但该文件不存在(实际相当于重命名源文件)
文件权限管理
文件基本权限
文件的基本权限包括读read、写write和执行execute,分别可以用4、2、1来表示;
它与用户密不可分,分为三组进行管理:
user:
对文件/目录所属用户设定权限;group:
对文件/目录所属组设定权限;other:
对文件/用户其他的组和用户设定权限;
对于文件而言:
Read: 表示可读取文件内容;
Write:表示可编辑、新增、修改、删除文件内容;
execute:表示可执行一个脚本程序;
对于目录而言:
Read: 表示可读取目录内的文件列表;
Write:表示可在目录内编辑、新增、修改、删除文件内容;
execute:表示能够进入目录;
文件的特殊权限
set uid
这是一种对二进位制程序设置的特殊权限,临时允许二进位制程序执行者用户文件所属主的权限,这是一种临时的、特殊的、有条件的授权方法。
这里有两个前提,缺一不可:
只有可执行的二进位制程序才能设定set uid权限;
命令执行者对该程序拥有执行(execute)权限;
例如/etc/shadow
这个文件,用来保存用户信息,处于系统安全的考虑,这个文件读、写、执行的权限都没有;但是passwd命令拥有suid的特殊权限位,如下图所示,出现在x位置的那个s,即表示suid,这就好像尚方宝剑,赋予它临时修改密码配置文件,也就是更改密码的权限。
由上图可知,/etc/shadow
默认的权限为000
,rwx
权限都没有的,也不能执行相应的操作。但 passwd
赋予一个特殊权限,让我们在执行passwd
命令时,临时拥有 root 权限,从而可以修改密码。
注意:
虽然常见的八位制权限掩码是三位数,但其实应该是四位数,第一位表示的特殊权限。
set uid
位采用八进制表示为4000
。passwd
是具有setuid
的一个特殊命令。这样我们不需要是root用户,也可以对自己的密码进行修改。设置set uid这个特殊权限很危险,不到万不得已,做好不要使用。
设置setuid的方法:
- 方法一:
1 | chmod 4755 [文件名] // 设置set uid |
- 方法二:
1 | chmod u+s [文件名] // 设置set uid |
set gid
set gid
就是将程序文件的 s 权限赋予组,当执行此程序时,此进程的属组不再是运行者本人所属的基本组,而是此程序文件的属组。
sgid 与suid相似,有一个重要特性,就是一旦对某个目录设置了sgid,该目录中创建的文件将继承该目录的所属组。
这就意味着如果我们要创建一个部门共享目录,可以早创建目录后,设置sgid权限,这样部门群组内的任何用户创建的文件都会属于该目录所属组。如此一来,该部门所有用户都能够顺利读取共享目录文件。
setgid位八进制表示为2000。
这里有两种情况:
set gid
赋予文件:运行此文件的其它用户具有这个文件的属组特性;set gid
赋予目录:任何用户在该目录下创建的文件,则该文件属组都和目录的属组一致。
设置方法:
- 方法一:
1 | chmod 2755 [filename/dirname] // 设置set gid |
- 方法二:
1 | chmod g+s [filename/dirname] // 设置set gid |
sticky bit (防删除位)
sticky bit
(防删除位):用户是否能够删除文件,关键在于是否拥有文件所在目录的写权限, 有写权限就能够删除,否则就不能。
sticky位八进制表示为1000,添加sticky bit
(防删除位)后,用户能够该目录下添加文件,但不能删除或者重命名文件。
例如,如果我们用root用户给共享目录设置sticky bit 权限,除非root用户,其他用户只能够添加文件,但不能删除或者重命名文件。
设置方法:
- 方法一:
1 | chmod 1755 [dirname] // 设置sticky bit |
方法二:
1 | chmod o+t [dirname] // 设置sticky bit |
修改文件的隐藏权限
chatrr 命令
命令格式 chatrr [ +-= ] [ 参数 ] [文件或目录名]
常见参数用法
命令 | 含义 |
---|---|
A | 文件或目录的atime不可修改 |
a | 只能追加不能删除,非root用户不能设定该属性 |
s | 会将数据同步写入磁盘 |
c | 自动压缩文件,读取时自动解压 |
i | 不能删除、重命名、设定链接、编辑写入及新增数据 |
常用用法
a
用法
1 | # touch a.txt |
注:删除a
权限用 chattr -a a.txt
i
用法
1 | # touch b.txt |
注:删除i
权限 用chattr -i b.txt
lsattr 命令
lsattr
用来读取文件或目录的特殊权限,命令格式为 lsattr [ 参数 ] [文件或目录名]
参数 | 含义 |
---|---|
a | 类似于ls -a ,表示连同隐藏文件一起列出 |
R | 连同子目录的信息一起列出 |
举个栗子
1 | # mkdir c1 |
链接文件
链接文件 ,即link file
,使用命令ls -l
查看文件信息,第一组属性首字母为l
的文件,类似于 windows
下的快捷方式。
链接文件link file
包括硬链接 hard link
和 软链接 symbolic link
两类。要搞清楚这两者的关系,需要先了解索引节点inode
。
索引节点inode
硬盘最小的文件单位位扇区“扇区” Sector
,每个扇区储存512字节(相当于0.5KB);而linux系统文件存取的最小单位,叫做块 block
,最常见的块 block
是4KB,由连续八个扇区 sector
组成一个块block
。
为了更方便的找到需要的文件,就需要有一个存储数据元信息的地方,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”,作用就像目录索引一样。
Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。当我们打开文件时,系统大致将这个过程分为三步:
找到文件名对应的inode号码;
通过inode号码,获取inode信息;
根据inode信息,找到文件数据所在的块
block
,然后读出数据。
inode 查询
查看某个文件的inode信息,使用命令行:
1 | stat [filename] |
硬链接 hard link
linux系统允许多个文件名指向同一个inode号,打个比方,每个人可以有不同的名字,大名、小名、别名、外号等等,但都只向
唯一的身份ID。因此,我们可以:
通过不同的文件名访问文件;
对文件内容进行修改,会影响到所有文件名;
删除一个文件名,不影响另一个文件名的访问;
注意:新建一个空目录,默认会生成两个目录项:.
和..
,前者.
等同于当前目录的”硬链接”,后者 ..
等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。
硬链接的不足
硬链接虽然看起来很美好,但是有两个不能克服的缺点:
不能跨文件分区;每个分区在格式化之前就指定inode数据元信息存放区和文件数据存放区,inode和数据的对应关系就会在一个分区里面关联,所以不能够跨分区。
不能对目录做硬链接(原因不明);
基于上述两个先天不足,就有了软链接的用武之地。
ln 命令 创建硬链接
1 | ln [源文件] [目标文件] |
软链接 symbolic link
与硬链接不同,软链接是建立一个独立的文件。例如,文件A和文件B的inode号不一样,但A的内容是B的路径,相当于一个路标。
这个路标是真实存在的独立文件,尽管它通常都很小。读取A时,系统会自动将访问者导向B,此时A就是B的软链接symbolic link
。
A依赖于B而存在,如果删除了B,打开文件A就会报错:
No such file or directory
。A指向B的文件名,而不是B的
inode
号码,因此B的inode
链接数不会因此发生变化。
ln -s命令可以创建软链接
1 | ln -s [源文文件或目录] [目标文件或目录] |