RHCSA 第二天学习笔记

25 阅读18分钟

RHCSA 第二天学习笔记

内容简介:tar、cat、less、more、head、tail(查看文档)、find(根据用户名查找)、grep、管道符(|)、重定向符、ln、vim、管理本地用户和组。


一、cp 复制(复习)

注意:同一目录下不能出现同名的文件!

cp 复制的目标路径(要复制的内容) 复制的目的路径(复制之后放到哪)
cp 复制的目标路径 复制的目的路径/新的文件名    # 复制并且重命名

注意点:

  1. cp 命令不能直接对目录进行复制,如果要复制目录,必须加上 -r 选项。
  2. 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
 ①   ② ③ ④  ⑤    ⑥      ⑦

每一行代表一个用户,不同字段用 : 分隔:

  1. root:用户名
  2. x:密码的占位符。早期密码写在这个位置,后来出于安全考虑,密码改放到 /etc/shadow 文件中
  3. 0:UID。系统不是根据用户名来识别用户的,而是根据 UID 来识别用户身份
  4. 0:GID,用户的主组 ID
  5. root:解释说明用,一般和用户名一样。登录界面显示的用户名其实就是这个字段
  6. /root:用户的家目录,用来存放用户个人的数据和配置文件
  7. /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:
 ①  ② ③ ④

每一行都是一个组,不同字段通过冒号分隔:

  1. root:组名
  2. x:密码占位符
  3. 0:GID
  4. (第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
......