RHCSA 第二天学习笔记
内容简介:tar、cat、less、more、head、tail(查看文档)、find(根据用户名查找)、grep、管道符(
|)、重定向符、ln、vim、管理本地用户和组。
一、cp 复制(复习)
注意:同一目录下不能出现同名的文件!
cp 复制的目标路径(要复制的内容) 复制的目的路径(复制之后放到哪)
cp 复制的目标路径 复制的目的路径/新的文件名 # 复制并且重命名
注意点:
cp命令不能直接对目录进行复制,如果要复制目录,必须加上-r选项。mv命令不会改变文件的原属性,但是cp命令在复制时会改变文件的原属性。如果要保留文件的原属性,需要使用-p选项。-a=-r+-p。
二、tar 打包压缩
1. 打包
打包的作用:将多个小文件整合成一个大文件,便于传输,提高安全性。
注意:如果要打包,最好将打包对象整合到同一目录中,然后对这个目录进行打包。
tar -cvf 打包后的包名 打包的对象路径
# -c 创建,-v 显示创建的过程
# -f 指定打包后的包名,所以 -f 选项后面要紧跟包名,一般把 -f 放在选项最后
示例:对目录 link 进行打包:
tar -cvf link.gz link # link.gz 是包名,link 是打包对象
查看包内容 / 解包:
tar -tvf 包的路径 # 查看包里的内容
tar -xvf 包的路径 # 解包(-x 解压,-v 显示过程,-f 指定包名)
tar -xvf 包的路径 -C 解压的指定路径 # 指定解压到哪个路径
查看压缩包的压缩算法:
file 压缩包名
2. 压缩
压缩的目的:缩小文件的大小,节省空间。
tar -压缩选项cvf 打包后的包名 打包的对象路径
有哪些压缩选项不需要去记忆,考试过程中会告诉你使用哪一种压缩算法,我们只要会用 man 手册通过指定压缩算法查找对应选项即可。
以 gzip 为例:
man tar --> 输入 /gzip 回车 --> 即可查找到 gzip 对应的压缩选项为 -z
注意:压缩包的后缀都是人为添加的,不能作为压缩格式的判断标准。想确定一个压缩包的压缩格式,使用
file 压缩包名。
压缩包的解压和包的解压一样:
tar -xvf 包的路径 -C 解压的指定路径
课堂示例:在 /etc 创建一个目录 redhat,然后在 redhat 下创建一个文件 1.html,然后对 redhat 这个目录进行压缩,压缩后的包名为 redhat.gz,压缩算法采用 gzip:
mkdir /etc/redhat
touch /etc/redhat/1.html
tar -zcvf redhat.gz /etc/redhat
file redhat.gz # 验证压缩格式
三、cat、less、more、head、tail(查看文档)
| 命令 | 特点 |
|---|---|
cat 文件路径 | 将文档内容一次性输出到终端,一般适用于小文件的查看 |
more 文件路径 | 按页输出。空格键翻页,b 键返回上一页。输出完毕后自动退出,文件内容残留在终端上 |
less 文件路径 | 按页输出,空格翻页,也可通过上下方向键按行滚动。q 退出,退出后终端没有内容残留 |
head -n 行数 文件路径 | 查看文件的前面几行(默认 10 行) |
tail -n 行数 文件路径 | 查看文件的末尾几行(默认 10 行) |
tail -f 文件路径 | -f 用来监测动态文件的变化(例如日志等) |
四、find 查找文件
find 查找的范围 查找的方式
1. 根据文件名查找
find 查找范围 -name 文件名
# -i 忽略大小写
# -name 默认是精确匹配,模糊查询可以使用 * 号(加上引号)
示例:
find / -name A # 查找 / 目录下文件名称为 A 的
find / -iname A # 查找 / 目录下文件名称为 A 或小写 a 的
课堂练习:
find /etc -name "pass*" # 查找 /etc 目录下 pass 开头的文件
find /etc -name "*wd" # 查找 /etc 目录下 wd 结尾的文件
find /etc -iname "*ss*" # 查找 /etc 目录中文件名含有 ss 字段的文件,忽略大小写
2. 根据文件大小范围查找
find 查找范围 -size 指定的文件大小
# +200M 表示大于 200M 的文件;-100M 表示小于 100M 的文件
示例:
find / -size +100M # 查找大于 100M 的文件(+ 代表大于)
find / -size -200M # 查找小于 200M 的文件
find / -size +100M -size -200M # 查找大于 100M 且小于 200M 的文件
find / -size +100M -size -200M -name "lib*" # 在上面的基础上,文件名以 lib 开头
3. 根据文件的所有者查找
find 查找范围 -user 用户名
find / -user redhat # 示例:查找文件所有者为 redhat 的文件
4. 根据文件的权限查找
-perm(等讲了权限之后再讲!)
5. find 重点:对查找到的文件进行批量操作(-exec)
find 查找范围 查找方式 -exec 执行命令 {} \;
# {} 用来代指 find 查找到的文件
# \; 是 -exec 的结束符(固定写法,别漏了)
# 含义:-exec 前面查找到的执行结果,交给后面的命令去处理
示例 1:在 /root 查找文件所有者为 redhat 的文件,并复制到当前目录的 jiance 目录下,要求保留文件的原属性(包括目录):
[root@0706 ~]# find /root -user redhat -exec cp -a {} ./jiance/ \;
示例 2:删除 /root 目录下文件名为 1.txt 的文件:
find /root -name 1.txt -exec rm -rf {} \;
五、grep 文本过滤命令
grep "关键字" 文件路径 # 从指定文本中,过滤出含有指定字段的行
| 选项 | 作用 |
|---|---|
-i | 忽略大小写 |
-n | 显示关键字段所在的行号 |
-v | 反选,过滤出不含指定字段的行 |
示例:
grep "root" /etc/passwd | grep "bash"
find / -user redhat | grep root
六、管道符(|)
作用:将前一个命令的正确输出,作为后一个命令的输入(后一个命令一般是文本处理命令)。
示例 1:利用管道符实现 grep 的多重过滤——从 /root 中查找以 .cfg 结尾的文件,然后再过滤出含有关键字的行:
find /root -name "*.cfg" | grep anaconda
示例 2:在 /etc/passwd 中过滤出既含 root 又含 bash 的行:
grep "root" /etc/passwd | grep "bash"
七、重定向符
重定向符分为 2 类:输入重定向 和 输出重定向。
- 标准输入:从键盘输入的内容显示在终端上,就是标准的输入。输入重定向是将原本从键盘输入的内容,改为从文本或其他地方获取。符号为
<、<<。 - 标准输出:命令或软件进程运行的结果输出到终端上,就是标准输出。输出重定向是将原本输出到终端的内容,重新定向到其他地方(例如本地文件)。符号为
>、>>。
区别:
>会将原文件的内容覆盖;>>会在原文件的末尾追加。另外> 文件路径可以快速地清空文档内容。
ping 127.0.0.1 > 1.txt # 覆盖写入
echo "jiance" > 1.txt
echo "123" >> 1.txt # 追加写入
输出重定向的 3 种
| 类型 | 符号 | 说明 |
|---|---|---|
| 正确输出重定向 | >、>>(即 1>、1>>) | 只有前面的命令运行结果正确时,才进行重定向 |
| 错误输出重定向 | 2>、2>> | 只有前面的命令运行结果错误时,才进行重定向 |
| 混合输出重定向 | &>、&>> | 无论结果正确还是错误,都会进行重定向 |
echo "jiance" 2> 1.txt # 命令正确,所以不会写入
echo "jiance" &> 1.txt # 正确错误都写入
特殊路径 /dev/null
重定向中有一个特殊的路径 /dev/null,类似于黑洞,无论什么扔进去都会消失。当运行的结果不想输出在终端、又不想保留在本地时,可以重定向到此路径下(比如 ping 命令)。
ping 127.0.0.1 > /dev/null
八、ln 链接命令(link)
链接的作用:1. 实时更新;2. 节省磁盘空间。
在 Linux 中,链接分为 2 种:硬链接 和 软链接。
注意:为了保证链接路径的准确无误,请使用绝对路径!!!
1. 硬链接
ln 源文件 链接后的文件名称
# 目录是不能够做硬链接的
ls -li 可以看到文件对应的索引号(inode),硬链接里源文件和链接文件的索引号是一样的。
2. 软链接
ln -s 链接目标 链接文件
# 软链接可以针对目录做
3. 软链接和硬链接的区别
| 对比项 | 硬链接 | 软链接 |
|---|---|---|
| 创建时 | 相当于给源文件起了一个别名,可以视为对源文件的一个备份 | 类似 Windows 中的快捷方式,通过创建一个新文件指向源文件 |
| 对目录 | 不可以对目录做硬链接 | 可以对目录做软链接 |
| 使用时 | 源文件发生改变后,链接文件也会随之改变(实时同步) | 同左 |
| 删除源文件后 | 硬链接还保留着源文件的数据,可以正常访问 | 软链接失效;如果重新创建一个和源文件同名且同路径的文件,软链接会自动关联 |
通过
ls -il查看两者与源文件的区别,-i选项可以查看文件的索引号。
九、vim 编辑器
Linux 系统中的文本编辑器。vim 是 vi 的升级版,如果系统比较老旧或者安装时选择的是最小化版本,那么系统中可能只有 vi 编辑器。vim 相比于 vi,在显示文件时会根据文件的位置、后缀或者文件名等增加语法高亮。
vim 文件路径
# 如果文件存在,直接打开;如果文件不存在,vim 会创建新文件并打开
vim 常用的 3 种模式
模式切换规则:在任何模式下,通过
Esc键返回命令模式;模式之间的切换也必须在命令模式下进行。
(1)命令模式
使用 vim 打开文件后,默认进入的就是命令模式。在命令模式下,敲入的字符会变成具有特殊功能的命令,不能直接用来编辑文本。
| 按键 | 作用 |
|---|---|
ndd | 从光标处删除 n 行 |
nyy | 从光标处复制 n 行 |
p | 粘贴 |
u | 撤销 |
Ctrl + r | 反撤销 |
注意:在 vim 中,光标只能通过上下左右方向键来移动。
(2)编辑模式
在命令模式下,输入 i/o/a/s 都可以进入编辑模式,左下方会有 -- INSERT -- 的提示。在编辑模式下可以对文档进行编辑。
| 按键 | 作用 |
|---|---|
i | 从光标处直接进入编辑模式 |
o | 从光标处另起一行进入编辑模式 |
a | 从光标处的后一个字符进入编辑模式 |
s | 删除光标处的字符,并进入编辑模式 |
注意:在红帽操作系统 7 版本之前,进行粘贴操作必须先进入编辑模式。
(3)底行命令模式
在命令模式下按 : 即可进入底行命令模式,左下方会出现一个 :。
| 命令 | 作用 |
|---|---|
:w | 保存 |
:q | 退出 |
:q! | 强制退出(不保存,! 是强制的意思) |
:wq | 保存并退出 |
:wq! | 强制保存并退出 |
查找功能:
:/关键字 凡是能和关键字匹配的字段都会被加上底色,n 键查找下一处
取消匹配字段底色的方法:输入一个无法匹配的字段再查找一次(当无法匹配时,就会取消底色)。
替换功能:
:1,2s/root/redhat/g
1,2代表替换的范围:第 1 行到第 2 行;如果是从第一行到最后一行,可以用%代替s代表替换操作/root代表替换的目标/redhat代表替换后的内容/g代表替换每一行匹配到的所有内容;如果没有g,只会替换每一行匹配到的第一个对象
最常见的替换方式:
:%s/替换内容/替换后的内容/g
示例:将 3.txt 中 hello world 里所有的 o 替换成 e:
:%s/o/e/g
设置命令:
:set number 显示行号
:set nonumber 取消显示行号
注意:vim 使用后,一定要使用命令正常关闭,不要直接关终端,否则下次打开会出现交换文件提示界面:
出现这样的界面后,首先按
r进行恢复,然后保存退出;再次打开文件,按d删除生成的交换文件。
十、管理本地用户
1. 什么是用户?
用户其实是一种身份,让我们在操作系统中所有的行为都有迹可循。同样我们也可以对不同用户设置不同的权限,从而保证系统的安全。
2. Linux 系统中的用户分类
| 用户类型 | 说明 | UID 范围 |
|---|---|---|
| 超级用户 | 管理员账号 root,权限最大 | UID = 0 |
| 系统用户 | 给软件进程使用的,权限比较大,软件的资源调度会使用到系统用户 | 0 < UID < 1000 |
| 普通用户 | 由管理员创建,日常使用,权限比较低 | UID >= 1000 |
3. 用户信息文件 /etc/passwd
用户信息存放在 /etc/passwd 文件中:
root:x:0:0:root:/root:/bin/bash
① ② ③ ④ ⑤ ⑥ ⑦
每一行代表一个用户,不同字段用 : 分隔:
- root:用户名
- x:密码的占位符。早期密码写在这个位置,后来出于安全考虑,密码改放到
/etc/shadow文件中 - 0:UID。系统不是根据用户名来识别用户的,而是根据 UID 来识别用户身份
- 0:GID,用户的主组 ID
- root:解释说明用,一般和用户名一样。登录界面显示的用户名其实就是这个字段
- /root:用户的家目录,用来存放用户个人的数据和配置文件
- /bin/bash:shell 类型。shell 是介于用户和操作系统之间的解释器,将用户输入的命令翻译成系统能够理解的语言。
/bin/bash是最常见的 shell;如果 shell 类型为/sbin/nologin,那么用户就无法登录到终端(包括 SSH)
4. 创建用户
useradd [选项] 用户名
| 选项 | 作用 |
|---|---|
-u | 指定用户的 UID |
-g | 指定用户的主组 ID(用户的主组必须事先存在) |
-c | 指定用户的注释说明 |
-d | 指明用户的家目录(不指明的话,默认是 /home/用户名) |
-s | 指明用户的 shell 类型 |
-G | 指定用户的附加组 |
示例:创建一个用户 user02,指定 UID 为 3000,并设置家目录为 /zhongbei/user02:
useradd -u 3000 -d /zhongbei/user02 user02
5. 设置密码
# 第一种方式(交互式)
passwd 用户名
# 第二种方式(非交互式)
echo "密码" | passwd --stdin 用户名
- 在 root 用户下:可以使用
passwd 用户名给指定用户设置密码,密码格式不受限制。 - 普通用户:只能使用
passwd修改自己的密码,不能使用passwd 用户名修改别人的密码;而且密码设置有要求——简单的密码、连续的密码都不能使用,密码必须 8 位以上。
6. 修改用户信息
usermod [选项] 用户名
| 选项 | 作用 |
|---|---|
-u | 修改用户的 UID |
-g | 修改用户的主组 ID(用户的主组必须事先存在) |
-c | 修改用户的注释说明 |
-d | 修改用户的家目录 |
-s | 修改用户的 shell 类型(/sbin/nologin 则无法登录终端) |
-G | 修改用户的附加组。直接使用 -G 会覆盖原有的附加组;不想覆盖的话,使用 -aG 在原有基础上追加 |
id student # 查看 student 用户的 UID 等信息
7. 删除用户
userdel -r 用户名
注意:除非题目要求不加
-r,一般情况下删除用户都要加上-r。如果不加-r,删除用户后,用户的家目录、邮箱目录里的数据依然会残留在系统中,导致数据安全问题。
如果忘记使用 -r,且用户已经删除了,补救方法:创建一个 UID 和用户名与残留数据用户一样的新用户,然后对新用户重新删除(这次加上 -r)。
示例:userdel student1(删除时忘记使用 -r)的补救:
[root@localhost ~]# ls -l /home/
drwx------. 3 1000 1000 78 Feb 14 16:29 student1 # 残留的家目录
[root@localhost ~]# useradd -u 1000 student1 # 建回同名同UID用户
[root@localhost ~]# userdel -r student1 # 带 -r 重新删除
[root@localhost ~]# ls -l /home/
total 0 # 残留清理干净
十一、组管理
1. 什么是组?
组是具有相同特征的一类用户的集合,便于对用户的批量管理。凡是用户在组内,就会享有和组一样的权限。
2. Linux 中的 2 种组
- 主组:用户有且只有一个主组。创建用户时如果没有指定主组,系统会自动创建一个和用户名同名的组作为用户的主组。
- 附加组:除了主组以外的组都是附加组。
3. 如何判断一个用户的主组和附加组
id 用户名
uid=0(root) gid=0(root) groups=0(root)
gid指明用户的主组(此例主组为 root 组)groups指明的是主组 + 附加组(此示例中无附加组)
4. 组信息文件 /etc/group
root:x:0:
① ② ③ ④
每一行都是一个组,不同字段通过冒号分隔:
- root:组名
- x:密码占位符
- 0:GID
- (第4段):附加组成员列表
5. 创建组
groupadd [选项] 组名
# -g 指明 GID
6. 修改组信息
groupmod [选项] 组名
# -g 修改 GID
# -n 修改组名(GID 不变的情况下修改组名)
7. 难点:给用户添加附加组
usermod 用户名 -aG 附加组名
[root@localhost ~]# usermod student1 -aG students
[root@localhost ~]# id student1
uid=1000(student1) gid=1000(student1) groups=1000(student1),6677(students)
# students 就是附加组
8. 删除组
groupdel 组名
注意:删除组时,如果该组已经作为某个用户的主组,那么不能直接删除——要么先更换用户的主组,要么连同用户一起删除。
十三、课后练习
第 1 题:vim 文档编辑综合题
要求:创建一个以自己名字拼音命名的文档,把 tar 的 man 手册内容粘贴进去;显示行号;所有
tar替换成WWW;每行第一个 tar 替换成 WWW。
# 1. 创建并打开文档(名字换成你自己的拼音,这里以 laowang 为例)
[root@localhost ~]# vim laowang.txt
2. 把 tar 的 man 手册内容弄进文档,两种方法:
方法一(课堂教法):另开一个终端执行 man tar,鼠标选中内容,
Ctrl+Shift+C 复制,回到 vim 按 i 进入编辑模式,Ctrl+Shift+V 粘贴
方法二(高手写法):在 vim 底行命令模式下直接读入命令输出
:r !man tar
3. 显示行号(底行命令模式):
:set number
4. 替换操作(底行命令模式,注意两种写法的区别):
:%s/tar/WWW/g ← 带 g:替换每行匹配到的【所有】 tar
:%s/tar/WWW ← 不带 g:只替换每行匹配到的【第一个】 tar
考点就在这个
g上:%表示全文范围,g表示一行内全部替换。不带g时每行只换第一个。题目里两种要求就是考你会不会区分带不带g。演示时可以替换完按u撤销,再换另一种写法对比效果。
最后 :wq 保存退出。
第 2 题:创建用户 + 附加组 + 特殊用户
# 0. 先把附加组建出来!!!组不存在,usermod -aG 直接报错,这是最坑的一步
[root@localhost ~]# groupadd groupuser
# 1. 创建三个用户
[root@localhost ~]# useradd student01
[root@localhost ~]# useradd student02
# student03 特殊要求:不能交互登录 → shell 设为 /sbin/nologin;家目录在 /tmp 下 → -d 指定
[root@localhost ~]# useradd -s /sbin/nologin -d /tmp/student03 student03
# 2. 给 student01、student02 加附加组(-aG 追加,别只用 -G,会覆盖)
[root@localhost ~]# usermod student01 -aG groupuser
[root@localhost ~]# usermod student02 -aG groupuser
验证:
[root@localhost ~]# id student01
uid=1001(student01) gid=1001(student01) groups=1001(student01),1003(groupuser)
[root@localhost ~]# id student02
uid=1002(student02) gid=1002(student02) groups=1002(student02),1003(groupuser)
[root@localhost ~]# grep student03 /etc/passwd
student03:x:1003:1004::/tmp/student03:/sbin/nologin
# ↑家目录在/tmp ↑不能登录的shell
第 3 题:在 /usr 下查找文件名含 ss 的,放到 1.txt
[root@localhost ~]# find /usr -name "*ss*" > 1.txt
拆解:
find /usr -name "*ss*"在 /usr 下按文件名模糊查找含 ss 的文件,>把正确输出覆盖写入 1.txt。重定向之前 1.txt 里有啥都会被清掉,正好符合"放到 1.txt 中"。
验证:
[root@localhost ~]# cat 1.txt
第 4 题:过滤 /etc/passwd 中 systemd 的内容,存到 2.txt
[root@localhost ~]# grep "systemd" /etc/passwd > 2.txt
拆解:
grep "systemd" /etc/passwd过滤出含 systemd 的行,>重定向存进 2.txt。find 管"找文件",grep 管"滤内容",这题是文件内容过滤,所以用 grep 不是 find,别搞混了。
验证:
[root@localhost ~]# cat 2.txt
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
......