第一次上传

This commit is contained in:
2025-08-27 14:07:52 +08:00
commit ac04d1bdb4
1310 changed files with 42760 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
# 01.Linux基础
## 01.Linux基础
### 1. 操作系统简介
世上本没有路,走的人多了,便变成了路。——鲁迅
这句话真的是鲁迅说的,出自鲁迅的《故乡》,我们可以理解为一个东西用的人多了,自然而然就会把这个东西的使用方式打磨完善了,人类自动获得了智慧开始就掌握了工具的使用方法。众所周知做不同的事情就需要有不同的方法,走不同的路,也就有了不同的工具。
一台机器往往有不同的零件组成,一台电脑也是由很多不同的硬件组成,这么多的硬件设备,就需要有一个系统去代替我们管理好,这个就是操作系统。
操作系统需要完成的任务很简单,就是去学习每个硬件的不同使用方法,专业的术语叫“安装驱动程序”,当操作系统学会了每个硬件的使用方法之后,就会以某种人类可以操作的方式来被人类使用,有的操作系统是图形化界面的,我们可以鼠标点击来操作,有的是命令行的,我们需要输入命令来操作,不管是哪种方式,最终都是让计算机硬件来为我们而工作。
![img](01.Linux基础/NqdVW2EgszsK2S8C.png!thumbnail)
### 2. Linux操作系统
不同的人对计算机有不同的操作习惯,不同的使用场景对操作系统有不同的挑战,所以当前就出现了多种多样的操作系统
* Windows
* 收费闭源操作系统,主要用于日常办公、游戏、娱乐多一些
* Linux
* 免费的,开源的,主要用于服务器领域,性能稳定,安全
* Unix
* 用于封闭的硬件环境,企业的应用依赖于定制化开发
### 3. Linux图谱
Linux发展到今天出现了大量不同的分支。不同的分支都有不同的发展方向可以扫描下面二维码查看Linux发现分支图或者点开[此链接](01.Linux基础/Linux-time-line.png)。
![img](01.Linux基础/vchYOkVRT5jjaslE.png!thumbnail)
### 4. Linux名词
* Linux系统内核指的是一个由Linus Torvalds负责维护提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
* Linux发行套件系统是我们常说的Linux操作系统也即是由Linux内核与各种常用软件的集合产品
### 5. RedHat认证
redhat是目前全球最大的Linux商业公司redhat为Linux技术工程师提供了一个考试认证通过这个考试认证的工程师可以获得redhat公司颁发的证书。
在行业内redhat的技术证书还是占有很高的含金量的证书的认证难度依次如下。
![img](01.Linux基础/C6ZHIFVnIvKcMyIJ.png!thumbnail)
#### 5.1 RHCSA
* 管理文件、目录、文档以及命令行环境;
* 使用分区、LVM逻辑卷管理本地存储
* 安装、更新、维护、配置系统与核心服务;
* 熟练创建、修改、删除用户与用户组并使用LDAP进行集中目录身份认证
* 熟练配置防火墙以及SELinux来保障系统安全。
#### 5.2 RHCE
* 熟练配置防火墙规则链与SElinux安全上下文
* 配置iSCSI互联网小型计算机系统接口服务
* 编写Shell脚本来批量创建用户、自动完成系统的维护任务
* 配置HTTP/HTTPS网络服务
* 配置FTP服务
* 配置NFS服务
* 配置SMB服务
* 配置SMTP服务
* 配置SSH服务
* 配置NTP服务。
* 自动化运维工具ansible
#### 5.3 RHCA
欲取得红帽RHCA认证您必须通过以下任意5门认证考试。
| 考试代码 | 认证名称 |
| :------- | :--------------------------------- |
| EX210 | 红帽OpenStack 认证系统管理员考试 |
| EX220 | 红帽混合云管理专业技能证书考试 |
| EX236 | 红帽混合云存储专业技能证书考试 |
| EX248 | 红帽认证 JBoss管理员考试 |
| EX280 | 红帽平台即服务专业技能证书考试 |
| EX318 | 红帽认证虚拟化管理员考试 |
| EX401 | 红帽部署和系统管理专业技能证书考试 |
| EX413 | 红帽服务器固化专业技能证书考试 |
| EX436 | 红帽集群和存储管理专业技能证书考试 |
| EX442 | 红帽性能调优专业技能证书考试 |

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,203 @@
# 02.Linux系统安装
## 02.Linux系统安装
RockyLinux系统在企业中一般是安装在服务器上的但是我们学习的时候买台服务器并不方便所以我们可以将其安装在虚拟机中(实际上很多企业也这么做)
### 1. vmware workstation软件安装
双击安装包
![img](02.Linux系统安装/4g9Z99lb8F8T6nGf.png!thumbnail)
![img](02.Linux系统安装/09tN5Cj17wphDZBX.png!thumbnail)
![img](02.Linux系统安装/ToY0x4TwwuZURyeu.png!thumbnail)
![img](02.Linux系统安装/QnBPcqVkc2xyY1OI.png!thumbnail)
![img](02.Linux系统安装/2TmDTLtwWhihadpy.png!thumbnail)
![img](02.Linux系统安装/krpLen55WN4aI9aq.png!thumbnail)
#### 1.1 输入许可证
![img](02.Linux系统安装/tFsXBLvGstOrsg22.png!thumbnail)
![img](02.Linux系统安装/vmXrqmcOtp3dpuE9.png!thumbnail)
![img](02.Linux系统安装/EFvj3LuLJHa5DYJp.png!thumbnail)
### 2. 创建RockyLinux虚拟机
#### 2.1 创建新的虚拟机
![image-20241107094733611](02.Linux系统安装/image-20241107094733611.png)
![image-20241107094801076](02.Linux系统安装/image-20241107094801076.png)
![image-20241107094846827](02.Linux系统安装/image-20241107094846827.png)
![image-20241107094927380](02.Linux系统安装/image-20241107094927380.png)
![image-20241107095020725](02.Linux系统安装/image-20241107095020725.png)
![image-20241107095058110](02.Linux系统安装/image-20241107095058110.png)
![image-20241107095108257](02.Linux系统安装/image-20241107095108257.png)
**以下选项全部保持默认或者按照图片中选择**
![image-20241107095123951](02.Linux系统安装/image-20241107095123951.png)
![image-20241107095138985](02.Linux系统安装/image-20241107095138985.png)
![image-20241107095225970](02.Linux系统安装/image-20241107095225970.png)
**创建新的虚拟磁盘**
![image-20241107095244947](02.Linux系统安装/image-20241107095244947.png)
![image-20241107095345078](02.Linux系统安装/image-20241107095345078.png)
完成创建
![image-20241107095404723](02.Linux系统安装/image-20241107095404723.png)
#### 2.2 编辑虚拟机设置
![image-20241107095457139](02.Linux系统安装/image-20241107095457139.png)
![image-20241107095634916](02.Linux系统安装/image-20241107095634916.png)
### 3. 安装RockyLinux系统
1. 点击开启此虚拟机
![image-20241107095740122](02.Linux系统安装/image-20241107095740122.png)
2. 鼠标点击进入这个黑框中,通过方向键选择**安装选项**,我们选择第一个:**Install Rocky Linux 9.4**
![image-20241107095851533](02.Linux系统安装/image-20241107095851533.png)
3. 依次按照图片所示,完成以下设置
![image-20241107100151344](02.Linux系统安装/image-20241107100151344.png)
![image-20241107100354662](02.Linux系统安装/image-20241107100354662.png)
4. 依次设置带有黄色感叹号的选项
选择安装位置:
![image-20241107100532001](02.Linux系统安装/image-20241107100532001.png)
选择安装的软件环境,标准安装:
![image-20241107100628467](02.Linux系统安装/image-20241107100628467.png)
选择网络和主机名,用于开启网络连接:
![image-20241107100715660](02.Linux系统安装/image-20241107100715660.png)
设置root密码为了方便操作我们统一设置为`2`,然后点击两次完成:
![image-20241107100832855](02.Linux系统安装/image-20241107100832855.png)
5. 点击开始安装,并且等待安装完成
![image-20241107100917153](02.Linux系统安装/image-20241107100917153.png)
6. 安装完成以后,点击重启系统
![image-20241107102045501](02.Linux系统安装/image-20241107102045501.png)
### 4. RockyLinux系统使用
重启之后就进入RockyLinux系统的界面没有图形化只有黑框框。然后我们先输入用户名`root`回车以后,在输入我们设置的密码`2`。但是输入密码的时候,是没有任何显示的,这是命令行为了保护密码的安全故意为之,我们我们输入了密码以后这直接回车即可进入系统。
![image-20241107102546288](02.Linux系统安装/image-20241107102546288.png)
如果输入密码回车之后,显示`[root@localhost ~]# `那么说明我们成功进入系统
最好检查一下,网络有没有问题,我们可以使用命令`ping qq.com -c 4`来测试与腾讯服务器的连通性,依次来判断网络是否正常连接。
![image-20241107102827911](02.Linux系统安装/image-20241107102827911.png)
如果输出的结果如图所示,说明我们系统的网络连接正常。那么接下来我们就是给这个系统拍个快照。
### 5. 虚拟机快照
快照可以理解为保存的一个当前状态的还原点,可以完整保存当前的环境及状态。当我们以后再实验中,不小心把环境弄坏了以后,我们可以通过拍摄的快照,时光回溯到现在这个状态,避免我们重新安装系统的麻烦。
#### 5.1 快照的创建
在创建快照的时候,一定要关机了以后再拍摄快照,不要在开机的状态下创建快照。
关机命令:
```shell
poweroff
```
创建快照:
在上方点击虚拟机,找到快照,拍摄快照,然后起个名字,最后点击拍摄快照。我们的快照就创建好了
![image-20241107105228110](02.Linux系统安装/image-20241107105228110.png)
![image-20241107105035212](02.Linux系统安装/image-20241107105035212.png)
#### 5.2 快照的使用
如果我们想要回复到某一个快照的时候,我们还是在上方虚拟机,快照,然后选择恢复到快照即可。
![image-20241107105209742](02.Linux系统安装/image-20241107105209742.png)
### 6. 远程管理Linux服务器
大多数情况下Linux服务器都是安装在数据中心机房的机柜里面的大家可以把数据中心理解为大仓库那么机柜就是一个个货架而管理人员都是坐在办公室当中通过电脑远程连接服务器进行管理所以我们在后续学习的时候为了方便全部使用远程连接。
Linux远程连接命令行工具有很多:
- xshell
- 收费工具,有免费版,基本能满足需求,目前比较主流
- putty
- 开源工具,功能比较简单
- MobaXterm
- 免费工具,功能比较齐全,本次课程中推荐使用
首先查看虚拟机的IP地址也就是Linux服务器的IP地址登录进虚拟机之后输入`ip address`可以查看
![image-20241107110434324](02.Linux系统安装/image-20241107110434324.png)
这边可以看到本次安装的RockyLinux操作系统获取到的IP地址是 `192.168.88.103` 每个人装的虚拟机获取的IP地址可能是不一样的需要仔细看清楚。
在连接之前我们需要在RockyLinux上设置一下让它允许通过root用户远程连接进来大家先照着做后面我们都会详细学到
```shell
[root@localhost ~]# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
[root@localhost ~]# systemctl restart sshd
```
#### 6.1 MobaXterm
解压之前下载的MobaXterm压缩包双击程序运行
![img](02.Linux系统安装/lHYC6evohETd7Dpv.png!thumbnail)
选择会话——ssh然后填入IP地址
![image-20241107110734508](02.Linux系统安装/image-20241107110734508.png)
输入密码以后,回车。如果让你保存密码,建议选择不保存
如下图所示,则为登录成功
![image-20241107111502691](02.Linux系统安装/image-20241107111502691.png)
MobaXterm工具只是用来远程连接和管理我们的RockyLinux虚拟机所以在使用的时候我们必须先启动RockyLinux虚拟机。然后再次使用MobaXterm工具连接上来。并且我们在MobaXterm上面执行的命令也都会被传递到我们的RockyLinux上面执行。
![image-20250620140548249](02.Linux系统安装/image-20250620140548249.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,553 @@
# 03.Linux命令
## 03.Linux命令
### 1. 初识shell
虽然我们已经安装好了系统,但是光会安装不会操作是不够的。我们还要像玩手机一样熟悉并记忆操作方法。
shell是系统的**用户界面**,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。实际上shell是一个**命令解释器**,它解释用户输入的命令并且把用户的意图传达给内核。(可以理解为用户与内核之间的翻译官角色)
![img](03.Linux命令/OZOSHbNQHEoUDF1z.png!thumbnail)
我们可以使用shell实现对Linux系统的大部分管理例如
1. 文件管理
2. 用户管理
3. 权限管理
4. 磁盘管理
5. 软件管理
6. 网络管理
使用shell的两种方式
* 交互式命令行
* 默认等待用户输入命令,输入一行回车后执行一行命令
* 效率低 适合少量的工作
* shell脚本
* 将需要执行的命令和逻辑判断语句都写入一个文件中,一起运行
* 效率高 适合完成复杂,重复性工作
### 2. bash shell提示符
登录Linux系统之后默认进入交互式的命令行界面在光标前边会出现提示符
```shell
[root@localhost ~]# 
[用户名@主机名 目录名]权限标识
```
* 用户名
* 当前登录的用户
* 主机名
* 当前这台主机的名字,默认叫`localhost`
* 目录名
* 当前光标所在的目录
* 当前用户家目录表示成`~`
* 权限标识
* 超级管理员权限就表示为`#`
* 普通用户标识为`$`
这个提示符格式被`$PS1`控制,我们可以查看这个变量
```shell
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
# \u表示是用户名 \h表示的是主机名 \W表示的当前所在目录 \$是权限标识
[root@localhost ~]# export PS1="{\u@\h}\W \$"
{root@localhost}~ $
# 可以通过export命令修改PS1变量让提示符可以根据你的习惯变化
# 修改回原来的样子
{root@localhost}~ $ $export PS1="[\u@\h \W]\$"
```
### 3. shell语法
命令 选项 参数
```shell
[root@localhost ~]# cal --year -m 2024
```
* 命令
* `cal`是命令,用于查看日历
* 选项
* `--year`是选项,表示显示一整年,这个是一个长选项,也就是单词都拼全了,需要两条`-`符号
* `-m`是短选项,是首字母,表示每个星期的星期一作为第一天
* 对于有些命令而言,可以不写选项,这样命令会有个默认的行为
* 短选项可以多个合并在一起,比如上面的命令可以写成`-ym`其中y是year简写可以和m写在一起而长选项不支持写在一起
* 参数
* `2020`是参数参数是命令作用的对象表示查看的是2020年的日历
我们也可以查看这个命令的所有选项
```shell
[root@localhost ~]# cal --help
用法:
 cal [选项] [[[]]]
选项:
 -1, --one        只显示当前月份(默认)
 -3, --three      显示上个月、当月和下个月
 -s, --sunday     周日作为一周第一天
 -m, --monday     周一用为一周第一天
 -j, --julian     输出儒略日
 -y, --year       输出整年
 -V, --version    显示版本信息并退出
 -h, --help       显示此帮助并退出
```
### 4. 常用命令
Linux的常见命令比较多这边只列出初学者最常用的部分命令大家可以根据命令意思去进行练习。
注意Linux会准确的识别出命令的大小写所以大家需要注意大小写的问题。命令选项和参数之间是用空格进行分隔请大家在输入的时候注意不要缺失空格。
学习Linux最重要的就是以下三个方面
1. 命令的积累
2. 原理的掌握
3. 大量的实战
下面就是开始第一步,积累基础的命令
#### 4.1 ls
用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)
```shell
ls [-alrtAFR] [name...]
```
##### 4.1.1 选项
* **-a**:显示所有文件及目录 (**.**开头的隐藏文件也会列出)
* **-l**除文件名称外亦将文件型态、权限、拥有者、文件大小等资讯详细列出r
* **-r**:将文件以相反次序显示(原定依英文字母次序)
* **-t**:将文件依建立时间之先后次序列出
* **-A**:同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
* **-F**:在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/",链接加"@"
```shell
[root@localhost etc]# ls -F
adjtime gnupg/ modprobe.d/ sestatus.conf
aliases GREP_COLORS modules-load.d/ setroubleshoot/
alternatives/ groff/ motd sgml/
anacrontab group motd.d/ shadow
at.deny group- mtab@ shadow-
audit/ grub2.cfg@ nanorc shells
authselect/ grub.d/ netconfig skel/
bash_completion.d/ gshadow NetworkManager/ smartmontools/
bashrc gshadow- networks sos/
bindresvport.blacklist gss/ nftables/ ssh/
binfmt.d/ host.conf nsswitch.conf@ ssl/
bluetooth/ hostname nsswitch.conf.bak sssd/
chrony.conf hosts nvme/ statetab.d/
chrony.keys inittab openldap/ subgid
cifs-utils/ inputrc opt/ subgid-
cockpit/ iproute2/ os-release@ subuid
cron.d/ issue PackageKit/ subuid-
cron.daily/ issue.d/ pam.d/ sudo.conf
cron.deny issue.net passwd sudoers
cron.hourly/ kdump/ passwd- sudoers.d/
cron.monthly/ kdump.conf pinforc sudo-ldap.conf
crontab kernel/ pkcs11/ sysconfig/
cron.weekly/ krb5.conf pkgconfig/ sysctl.conf
crypto-policies/ krb5.conf.d/ pki/ sysctl.d/
crypttab ld.so.cache plymouth/ systemd/
csh.cshrc ld.so.conf pm/ system-release@
csh.login ld.so.conf.d/ polkit-1/ system-release-cpe
dbus-1/ libaudit.conf popt.d/ terminfo/
dconf/ libibverbs.d/ printcap tmpfiles.d/
debuginfod/ libnl/ profile tpm2-tss/
default/ libreport/ profile.d/ trusted-key.key
depmod.d/ libssh/ protocols tuned/
dhcp/ libuser.conf rc.d/ udev/
DIR_COLORS locale.conf rc.local@ updatedb.conf
DIR_COLORS.lightbgcolor localtime@ redhat-release@ vconsole.conf
dnf/ login.defs resolv.conf vimrc
dracut.conf logrotate.conf rocky-release virc
dracut.conf.d/ logrotate.d/ rocky-release-upstream vmware-tools/
environment lsm/ rpc wgetrc
ethertypes lvm/ rpm/ X11/
exports machine-id rsyncd.conf xattr.conf
favicon.png@ magic rsyslog.conf xdg/
filesystems mailcap rsyslog.d/ xml/
firewalld/ makedumpfile.conf.sample rwtab.d/ yum/
fonts/ man_db.conf samba/ yum.conf@
fprintd.conf mcelog/ sasl2/ yum.repos.d/
fstab microcode_ctl/ security/
fuse.conf mime.types selinux/
gcrypt/ mke2fs.conf services
```
* **-R**:若目录下有文件,则以下之文件亦皆依序列出
* **-h**:将显示出来的文件大小以合适的单位显示出来
##### 4.1.2 **实例**
* 查看当前目录下的文件
```shell
[root@localhost ~]# ls
```
* 查看根目录下的文件,查看/usr目录下的文件
```shell
[root@localhost ~]# ls /
[root@localhost ~]# ls /usr
```
* 查看当前目录下所有文件,包括隐藏文件
```shell
[root@localhost ~]# ls -a
```
* 查看当前目录下文件详情,包括隐藏文件
```shell
[root@localhost ~]# ls -lha
```
* 查看当前目录下的文件,并且显示出目录,文件,程序的区别
```shell
[root@localhost ~]# ls -F
anaconda-ks.cfg dirb/ dird/ file2 file4 ping*
dira/ dirc/ dire/ file1 file3 file5
# 可以看到普通文件只有文件名,可执行文件后面带*,文件夹后面带/
```
* 查看当前目录下的文件,如果有文件夹,那么将文件夹中的文件也显示出来
```shell
[root@localhost ~]# ls -FR
# dir这是一个目录在这个目录下的文件也全部显示出来
[root@localhost ~]# ls -FRl
# 显示详细的信息
```
##### 4.1.3 扩展知识
```shell
[root@localhost ~]# ls -ahl
总用量 24K
dr-xr-x---. 3 root root 139 4月 2 14:00 .
dr-xr-xr-x. 17 root root 224 6月 21 2020 ..
-rw-------. 1 root root 128 4月 2 09:37 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
drwxr-xr-x. 2 root root 32 4月 2 14:00 dir
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
-rw-r--r--. 1 root root 0 4月 2 14:00 test.txt
```
1. **第一列**共10位第1位表示文档类型`d`表示目录,`-`表示文件,`l`表示链接文件,`d`表示可随机存取的设备如U盘等`c`表示一次性读取设备如鼠标、键盘等。后9位依次对应三种身份所拥有的权限身份顺序为owner、group、others权限顺序为readable、writable、excutable。如`-r-xr-x---`的含义为**当前文档是一个文件,拥有者可读、可执行,同一个群组下的用户,可读、可写,其他人没有任何权限**
2. **第二列**表示链接数表示有多少个文件链接到inode号码。
3. **第三列**表示拥有者
4. **第四列**表示所属群组
5. **第五列**表示文档容量大小,单位字节
6. **第六列**表示文档最后修改时间,注意不是文档的创建时间哦
7. **第七列**表示文档名称。以点(.)开头的是隐藏文档
#### 4.2 cd
用于切换当前工作目录
```shell
cd [dirName]
```
##### 4.2.1 实例
* 跳转到`/usr/bin`目录下
```shell
[root@localhost ~]# cd /usr/bin
```
* 跳到自己的 home 目录
```shell
[root@localhost bin]# cd ~
```
* 跳到目前目录的上一层
```shell
[root@localhost ~]# cd ..
```
#### 4.3 pwd
显示工作目录
```shell
pwd [-LP]
```
* -L打印 $PWD 变量的值,如果它命名了当前的工作目录
* -P 打印当前的物理路径,不带有任何的符号链接
```shell
[root@localhost ~]# pwd
/root
```
#### 4.4 clear
用于清除屏幕
```shell
clear
```
#### 4.5 echo
用于字符串的输出
```shell
echo [-neE] 字符串
```
##### 4.5.1 选项
* **-n**不输出行尾的换行符
* **-e**:允许对下面列出的加反斜线转义的字符进行解释
* \\    反斜线
* \a    报警符(BEL)
* \b    退格符
* \c    禁止尾随的换行符
* \f    换页符
* \n    换行符
* \r    回车符
* \t    水平制表符
* \v    纵向制表符
* -E 禁止对在STRINGs中的那些序列进行解释
##### 4.5.2 实例
* 显示出`hello world`
```shell
[root@localhost ~]# echo "hello world"
```
* 用两行显示出`hello world`
```shell
[root@localhost ~]# echo -e "hello\nworld"
```
* 输出`hello world`的时候让系统发出警报音
```shell
[root@localhost ~]# echo -e "hello\aworld"
```
### 5. 系统命令
#### 5.1 poweroff
用于关闭计算器并切断电源
```shell
poweroff [-n] [-w] [-d] [-f] [-h]
```
##### 5.1.1 选项
* **-n**: 这个选项用于在关机时不执行文件系统的同步操作,即不调用 `sync()` 系统调用。通常,系统在关机时会自动同步所有挂载的文件系统,以确保所有挂起的磁盘写入操作都完成,从而避免数据丢失。使用 `-n` 参数可以跳过这个同步过程。
* **-w**: 仅记录关机信息到 `/var/log/wtmp` 文件中,但并不实际执行关机操作。
* **-d**: 不把记录写到 /var/log/wtmp 文件里
* **-f**:强制关机。此参数会立即停止所有进程并关闭系统,而不是正常关机流程。
#### 5.2 reboot
用来重新启动计算机
```shell
reboot [-n] [-w] [-d] [-f]
```
##### 5.2.1 选项
* **-n**: 这个选项用于在关机时不执行文件系统的同步操作,即不调用 `sync()` 系统调用。通常,系统在关机时会自动同步所有挂载的文件系统,以确保所有挂起的磁盘写入操作都完成,从而避免数据丢失。使用 `-n` 参数可以跳过这个同步过程。
* **-w**: 仅记录重启信息到 `/var/log/wtmp` 文件中,但并不实际执行重启操作。
* **-d**: 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d
* **-f**: 强迫重开机,不呼叫 shutdown 这个指令
#### 5.3 whoami
用于显示自身用户名称
```shell
[root@localhost ~]# whoami
root
```
### 6. 快捷键
| 快捷键 | 作用 |
| :----- | :----------------------- |
| ^C | 终止前台运行的程序 |
| ^D | 退出 等价exit |
| ^L | 清屏 |
| ^A | 光标移动到命令行的最前端 |
| ^E | 光标移动到命令行的后端 |
| ^U | 删除光标前所有字符 |
| ^K | 删除光标后所有字符 |
| ^R | 搜索历史命令,利用关键词 |
### 7. 帮助命令
#### 7.1 history
```shell
history [n]  n为数字列出最近的n条命令
```
##### 7.1.1 选项
* **-c**将目前shell中的所有history命令消除
* **-a**将目前新增的命令写入histfiles, 默认写入`~/.bash_history`
* **-r**将histfiles内容读入到目前shell的history记忆中
* **-w**将目前history记忆的内容写入到histfiles
##### 7.1.2 实例
* 将history的内容写入一个新的文件中
```shell
[root@localhost ~]# history -w histfiles.txt
```
* 情况所有的history记录注意并不清空`~/.bash_history`文件
```shell
[root@localhos t ~]# history -c
```
* 使用`!`执行历史命令。
* `! number`执行第几条命令
* `! command`从最近的命令查到以`command`开头的命令执行
* `!!`执行上一条
```shell
[root@localhost ~]# history
1 history
2 cat .bash_history
3 ping -c 3 baidu.com
4 history
[root@localhost ~]# !3
# 这里是执行第三条命令的意思
```
#### 7.2 help
显示命令的帮助信息
```shell
help [-dms] [内置命令]
```
##### 7.2.1 选项
* **-d**:输出每个主题的简短描述
* **-m**:以伪 man 手册的格式显示使用方法
* -s为每一个匹配 PATTERN 模式的主题仅显示一个用法
##### 7.2.2 实例
* 查看echo的帮助信息
```shell
[root@localhost ~]# help echo
```
#### 7.3 man
显示在线帮助手册页
```shell
man 需要帮助的命令或者文件
```
##### 7.3.1 快捷键
| 按键 | 用途 |
| :-------- | :--------------------------------- |
| 空格键 | 向下翻一页 |
| PaGe down | 向下翻一页 |
| PaGe up | 向上翻一页 |
| home | 直接前往首页 |
| end | 直接前往尾页 |
| / | 从上至下搜索某个关键词,如“/linux” |
| ? | 从下至上搜索某个关键词,如“?linux” |
| n | 定位到下一个搜索到的关键词 |
| N | 定位到上一个搜索到的关键词 |
| q | 退出帮助文档 |
##### 7.3.2 手册的结构
| 结构名称 | 代表意义 |
| :---------- | :----------------------- |
| NAME | 命令的名称 |
| SYNOPSIS | 参数的大致使用方法 |
| DESCRIPTION | 介绍说明 |
| EXAMPLES | 演示(附带简单说明) |
| OVERVIEW | 概述 |
| DEFAULTS | 默认的功能 |
| OPTIONS | 具体的可用选项(带介绍) |
| ENVIRONMENT | 环境变量 |
| FILES | 用到的文件 |
| SEE ALSO | 相关的资料 |
| HISTORY | 维护历史与联系方式 |
#### 7.4 alias
用于设置指令的别名
##### 7.4.1 实例
* 查看系统当前的别名
```shell
[root@localhost ~]# alias # 查看系统当前的别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]# ll
总用量 4
-rw-------. 1 root root 1241 8月 22 2018 anaconda-ks.cfg
drwxr-xr-x. 2 root root 19 8月 21 12:15 home
[root@xwz ~]# type -a ls # 查看命令类型
ls 是 `ls --color=auto' 的别名
ls 是 /usr/bin/ls
```
* 修改别名比如使用wl来查看IP地址相关信息
```shell
[root@localhost ~]# alias wl='ip address'
[root@localhost ~]# wl
```
* 为了让别名永久生效,可以讲修改别名的命令写入`bashrc`文件,这个文件中的命令会在每次登陆命令行的时候执行
```shell
[root@localhost ~]# echo "alias wl='ip address'" >> /etc/bashrc
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -0,0 +1,525 @@
# 04.文件管理
## 04.文件管理
我们知道Linux的目录结构为树状结构最顶级的目录为根目录 /。
其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。
在开始本教程前我们需要先知道什么是绝对路径与相对路径。
* 绝对路径
* 路径的写法,由根目录`/`写起,例如:`/usr/share/doc`这个目录
* 相对路径
* 路径的写法,不是由`/`写起,例如由`/usr/share/doc`要到`/usr/share/man`底下时,可以写成:`cd ../man`这就是相对路径的写法。
### 1. 文件管理命令
几个常见的处理目录的命令
* ls英文全拼list files: 列出目录及文件名
* cd英文全拼change directory切换目录
* pwd英文全拼print work directory显示目前的目录
* mkdir英文全拼make directory创建一个新的目录
* rmdir英文全拼remove directory删除一个空的目录
* cp英文全拼copy file: 复制文件或目录
* rm英文全拼remove: 删除文件或目录
* mv英文全拼move file: 移动文件与目录,或修改文件与目录的名称
* touch: 用于创建一个新的文件
#### 1.1 touch创建新文件
用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
```shell
touch 文件名
```
##### 1.1.1 实例
* 创建新空白文件
```shell
[root@localhost ~]# touch newfile
```
#### 1.2 mkdir (创建新目录)
创建新的目录的
```shell
mkdir [-mpv] 目录名称
```
##### 1.2.1 选项
* **-m**:配置文件的权限,直接配置,不需要看默认权限 (umask)
* **-p**:帮助你直接将所需要的目录(包含上一级目录)递归创建起来!
* **-v**: 显示目录创建的过程
##### 1.2.2 实例
```shell
[root@localhost ~]# mkdir dir
# 创建一个新的文件夹叫dir
[root@localhost ~]# mkdir a/b/c
mkdir: 无法创建目录"a/b/c": 没有那个文件或目录
# 无法直接创建多层目录
[root@localhost ~]# mkdir -p a/b/c
# 加上-p选项之后可以自动创建父级目录
[root@localhost ~]# mkdir -pv dir1/dir2
mkdir: 已创建目录 "dir1"
mkdir: 已创建目录 "dir1/dir2"
# 显示详细的创建过程
```
#### 1.3 cp (复制文件或目录)
拷贝文件和目录
```shell
cp [选项]... 源文件... 目录
```
##### 1.3.1 选项
* **-a**相当于`-pdr `的意思,至于` pdr` 请参考下列说明;(常用)
* **-d**如果源文件是符号链接,则复制链接本身,而不是链接指向的文件;
* **-f**为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
* **-i**若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
* **-l**复制符号链接指向的文件,而不是链接本身;
* **-p**连同文件的属性一起复制过去,保持文件的原始属性(如时间戳、权限等)(备份常用)
* **-r**递归持续复制,用於目录的复制行为;(常用)
* **-u**仅在源文件比目标文件新或目标文件不存在时进行复制;
* **-v**显示复制的详细过程
##### 1.3.2 实例
```shell
[root@localhost ~]# mkdir /home/dir{1,2}
[root@localhost ~]# touch install.log
[root@localhost ~]# cp -v install.log /home/dir1
# 复制文件到目录下
[root@localhost ~]# cp -v install.log /home/dir1/abc.txt
# 复制文件到目录下并且重命名为abc.txt
[root@localhost ~]# cp -rv /etc /home/dir1
# 复制目录
[root@localhost ~]# cp -rv /etc/passwd /etc/hostname /home/dir2
# 将多个文件复制到同一个目录
[root@localhost ~]# cp -rv /etc/passwd /etc/hostname .
# 将多个文件复制到当前目录
[root@localhost ~]# type -a cp
cp 是 `cp -i' 的别名
cp 是 /usr/bin/cp
[root@localhost ~]# cp -rv install.log{,-old}
# 备份配置文件
```
#### 1.4 mv(移动文件与目录,或修改名称)
移动文件与目录,或修改名称
```shell
mv [选项]... 源文件... 目录
```
##### 1.4.1 选项
* **-f**force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
* **-i**:若目标文件 (destination) 已经存在时,就会询问是否覆盖!
* **-u**:若目标文件已经存在,且 source 比较新,才会升级 (update)
* **-v**显示复制的详细过程
##### 1.4.2 实例
```shell
[root@localhost ~]# touch file1
[root@localhost ~]# mv file1 /home/dir2
# 将file1移动到/home/dir2
[root@localhost ~]# touch file2
[root@localhost ~]# mv file2 /home/dir2/file20
# 将file2移动到/home/dir2并且改名file20
[root@localhost ~]# mv file file.txt
# 将file改名为file.txt
```
#### 1.5 rm (移除文件或目录)
移除文件或目录
```shell
rm [选项]... 文件...
```
##### 1.5.1 选项
* **-f**:就是 force 的意思,忽略不存在的文件,不会出现警告信息;
* **-i**:互动模式,在删除前会询问使用者是否动作
* **-r**:递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!
##### 1.5.2 实例
```shell
[root@localhost ~]# cd /home
[root@localhost home]# rm -rf dir1
```
##### 1.5.3 禁忌命令
如下命令会从根目录开始删除Linux系统中所有的文件包括系统文件。严令禁止在任何服务器上输入如下命令
```sh
[root@localhost ~]# rm -rf /*
```
### 2. 文本文件查看
在Linux中一切皆文件说的就是Linux利用文本文件来保存系统所有的设置。
我们在Linux中想实现一个功能不可避免的需要查看文本文件修改文本文件。
#### 2.1 cat
用于打开文本文件并显示出来
```shell
cat [选项]... [文件]...
```
##### 2.1.1 选项
* **-n**:由 1 开始对所有输出的行数编号
* **-b**:和 -n 相似,只不过对于空白行不编号。
* **-s**:当遇到有连续两行以上的空白行,就代换为一行的空白行。
* **-A**:显示控制字符。
##### 2.1.2 实例
* 查看anaconda-ks.cfg文件
```shell
[root@localhost ~]# cat anaconda-ks.cfg
```
* 查看anaconda-ks.cfg文件并且显示行号
```shell
[root@localhost ~]# cat -n anaconda-ks.cfg
```
#### 2.2 less
可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页
##### 2.2.1 实例
```shell
[root@localhost ~]# less anaconda-ks.cfg
```
#### 2.3 head
查看文件的开头部分的内容
```shell
head [选项]... [文件]...
```
##### 2.3.1 参数
* **-q**:隐藏文件名,默认是隐藏
* **-v**:显示文件名
* **-c<数目>**:显示的字节数。
* **-n<行数>**:显示的行数。
##### 2.3.2 实例
* 查看文件的前6行
```shell
[root@localhost ~]# head -n 6 anaconda-ks.cfg
```
#### 2.4 tail
会把文本文件里的最尾部的内容显示在屏幕上
```shell
tail [选项]... [文件]...
```
##### 2.4.1 参数
* **-f**:循环读取
* **-q**:隐藏文件名,默认隐藏
* **-v**:显示文件名
* **-c<数目>**:显示的字节数
* **-n<行数>**:显示文件的尾部 n 行内容
* **-s**:与-f合用,表示在每次反复的间隔休眠S秒
##### 2.4.2 实例
* 查看文件anaconda-ks.cfg尾部的3行
```shell
[root@localhost ~]# tail -n 3 anaconda-ks.cfg
```
* 查看日志的实时更新情况
```shell
[root@localhost ~]# tail -f /var/log/messages 
# ctrl+c退出
```
* 查看文件anaconda-ks.cfg从第10行到结尾
```shell
[root@localhost ~]# tail -n +10 anaconda-ks.cfg
```
#### 2.5 grep
针对文件内容进行过滤,本工具属于文本三剑客,后续会详细讲解,目前只要求初学者掌握最基本的实例即可
##### 2.5.1 实例
```shell
[root@xwz ~]# grep 'root' /etc/passwd
# 在/etc/passwd的文件中找出有root的行
[root@xwz ~]# grep '^root' /etc/passwd
# 在/etc/passwd中找出root开头的行
[root@xwz ~]# grep 'bash$' /etc/passwd
# 在/etc/passwd中找出bash结尾的行
```
### 3. 文本文件编辑
在Linux中只掌握文本查看是远远不够的我们还需要掌握编辑文本文件。
Linux上也有图形化的文本编辑器类似于windows的记事本但是很多时候我们只能用命令行来管理Linux操作系统所以必须要掌握命令行的文本编辑器软件。
目前常见的命令行文本编辑器
* **nano**在debain系列的系统上会比较常见但是其他的Linux发行版也都可以安装
* **vi**:所有的 Unix Like 系统都会内建 vi 文本编辑器,其他的文本编辑器则不一定会存在。
* **vim**:具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
目前vim是使用的最多的也是比较推荐的下面就来讲一下vim
#### 3.1 什么是 vim
Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。
连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。
vim是一个纯命令行文本编辑器很多文本编辑的功能都是通过键盘快捷键的方式完成所以我们需要记住常用的键位在vim官方网站上我们可以找到vim键盘图的完整版不过对于初学者来说我们只需要知道常用的就可以了。
![img](04.文件管理/VSC5sIsVH0dd5r4b.png!thumbnail)
#### 3.2 vi/vim 的使用
基本上 vi/vim 共分为三种模式分别是命令模式Command mode输入模式Insert mode和末行模式Last line mode。 这三种模式的作用分别是:
##### 3.2.1 命令模式
用户刚刚启动 vi/vim便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令而非输入字符。比如我们此时按下`i`,并不会输入一个字符,`i`被当作了一个命令。
以下是常用的几个命令:
* **i**切换到输入模式,以输入字符。
* **x**删除当前光标所在处的字符。
* **:**切换到末行模式,以在最底一行输入命令。
若想要编辑文本启动Vim进入了命令模式按下i切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠末行模式输入更多命令。
##### 3.2.2 输入模式
在命令模式下按下`i`就进入了输入模式。
在输入模式中,可以使用以下按键:
* **字符按键以及Shift组合**,输入字符
* **ENTER**,回车键,换行
* **BACK SPACE**,退格键,删除光标前一个字符
* **DEL**,删除键,删除光标后一个字符
* **方向键**,在文本中移动光标
* **HOME**/**END**,移动光标到行首/行尾
* **Page Up**/**Page Down**,上/下翻页
* **Insert**,切换光标为输入/替换模式,光标将变成竖线/下划线
* **ESC**,退出输入模式,切换到命令模式
##### 3.2.3 末行模式
在命令模式下按下`:`(英文冒号)就进入了末行模式。
末行模式可以输入单个或多个字符的命令,可用的命令非常多。
在末行模式中,基本的命令有:
* **:q**退出程序
* **:w**保存文件
按ESC键可随时退出末行模式。
简单的说,我们可以将这三个模式的关系用下图来表示:
![img](04.文件管理/MWU4OFLvWWa1A2ss.png!thumbnail)
#### 3.3 vi/vim使用实例
有些linux发行套件上并没有安装vim我们可以安装一下下面提供了Rockylinux的安装命令
```shell
[root@localhost ~]# yum -y install vim
# yum是在线安装软件的命令后面会有详细的介绍这边直接使用
```
vi和vim大部分的操作完全一模一样所以会使用vim自然也会使用vi
###### 3.3.1 编辑一个文档
直接输入`vim 文件名`就能够进入 vim 的命令模式了。请注意,记得 vim 后面一定要加文件名,不管该文件存在与否!
```shell
[root@localhost ~]# vim file.txt
```
输入这条命令之后,会看到如下画面
![img](04.文件管理/42U7itSOgHyWtuqL.png!thumbnail)
按下`i`进入输入模式(也称为编辑模式),开始编辑文字
在命令模式之中,只要按下`i`,`o`,`a`等字符就可以进入输入模式了!
在编辑模式当中,你可以发现在左下角状态栏中会出现`--INSERT--`的字样,那就是可以输入任意字符的提示。
这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。
![img](04.文件管理/Dq9zxTG0hFbvVxWT.png!thumbnail)
好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角`--INSERT--`的不见了!
![img](04.文件管理/tbzxHA3IzuTWivl7.png!thumbnail)
输入**:wq**后回车即可保存离开,注意其中的冒号必须是英文输入法下的冒号!
![img](04.文件管理/7wuLg7WlsebgxAQn.png!thumbnail)
现在我们就成功创建了一个文件,查看文件的内容吧
```shell
[root@localhost ~]# ls -lh file.txt
[root@localhost ~]# cat file.txt
```
#### 3.4 vi/vim按键说明
除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。
下面将会列举出vim非常多的常用按键初学者只需要浏览一遍记住大概vim有哪些功能等后面大量使用vim的时候再来翻阅笔记并且在多次使用中把这些功能记住。
##### 3.4.1 命令模式
下面的操作都是在命令模式下进行的
**移动光标的方法**
| h 或 向左箭头键(←) | 光标向左移动一个字符 |
| :----------------- | :----------------------------------------------------------- |
| j 或 向下箭头键(↓) | 光标向下移动一个字符 |
| k 或 向上箭头键(↑) | 光标向上移动一个字符 |
| l 或 向右箭头键(→) | 光标向右移动一个字符 |
| [Ctrl] + [f] | 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) |
| [Ctrl] + [b] | 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) |
| [Ctrl] + [d] | 屏幕『向下』移动半页 |
| [Ctrl] + [u] | 屏幕『向上』移动半页 |
| + | 光标移动到非空格符的下一行 |
| - | 光标移动到非空格符的上一行 |
| n<space> | 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。 |
| 0 或功能键[Home] | 这是数字『 0 』:移动到这一行的最前面字符处 (常用) |
| $ 或功能键[End] | 移动到这一行的最后面字符处(常用) |
| H | 光标移动到这个屏幕的最上方那一行的第一个字符 |
| M | 光标移动到这个屏幕的中央那一行的第一个字符 |
| L | 光标移动到这个屏幕的最下方那一行的第一个字符 |
| G | 移动到这个档案的最后一行(常用) |
| nG | n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu) |
| gg | 移动到这个档案的第一行,相当于 1G 啊! (常用) |
| n<Enter> | n 为数字。光标向下移动 n 行(常用) |
**文本的搜索与替换**
| /word | 向光标之下寻找一个名称为 word 的字符串。 (常用) |
| :----------------------------------------- | :----------------------------------------------------------- |
| ?word | 向光标之上寻找一个字符串名称为 word 的字符串。 |
| n | 这个 n 是英文按键。代表重复前一个搜寻的动作。 |
| N | 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 |
| :n1,n2s/word1/word2/g | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 (常用) |
| :1,$s/word1/word2/g 或 :%s/word1/word2/g | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 (常用) |
| :1,$s/word1/word2/gc 或 :%s/word1/word2/gc | 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用) |
**删除/剪切、复制与粘贴**
| x, X | 在一行字当中x 为向后删除一个字符 (相当于 [del] 按键) X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
| :------- | :----------------------------------------------------------- |
| nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 |
| dd | 删除/剪切光标所在的那一整行(常用) |
| ndd | n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用) |
| d1G | 删除光标所在到第一行的所有数据 |
| dG | 删除光标所在到最后一行的所有数据 |
| d$ | 删除游标所在处,到该行的最后一个字符 |
| d0 | 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符 |
| yy | 复制游标所在的那一行(常用) |
| nyy | n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) |
| y1G | 复制游标所在行到第一行的所有数据 |
| yG | 复制游标所在行到最后一行的所有数据 |
| y0 | 复制光标所在的那个字符到该行行首的所有数据 |
| y$ | 复制光标所在的那个字符到该行行尾的所有数据 |
| p, P | p 为将已复制的数据在光标下一行贴上P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) |
| J | 将光标所在行与下一行的数据结合成同一行 |
| c | 重复删除多个数据,例如向下删除 10 行,[ 10c ] |
| u | 复原前一个动作。(常用) |
| [Ctrl]+r | 重做上一个动作。(常用) |
| . | 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
**进入输入或取代的编辑模式**
| i, I | 进入输入模式(Insert mode) i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用) |
| :---- | :----------------------------------------------------------- |
| a, A | 进入输入模式(Insert mode) a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用) |
| o, O | 进入输入模式(Insert mode) 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用) |
| r, R | 进入取代模式(Replace mode) r 只会取代光标所在的那一个字符一次R会一直取代光标所在的文字直到按下 ESC 为止;(常用) |
| [Esc] | 退出编辑模式,回到一般模式中(常用) |
**末行模式下的储存、离开等指令**
| :w | 将编辑的数据写入硬盘中(常用) |
| :------------------ | :----------------------------------------------------------- |
| :w! | 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权限有关 |
| :q | 离开 vi (常用) |
| :q! | 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。 |
| :wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
| ZZ | 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) |
| :x | 效果等同于(保存并退出) |
| :X | 大写的X用于加密文件 |
| ZQ | 不保存,强制退出。效果等同于**:q!**。 |
| :w [filename] | 将编辑的数据储存成另一个文件(类似文件另存为) |
| :r [filename] | 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在行后面 |
| :n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个文件。 |
| :! command | 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息! |
**vim环境变量修改**
| :set nu | 显示行号,设定之后,会在每一行的前缀显示该行的行号 |
| :-------- | :------------------------------------------------- |
| :set nonu | 与 set nu 相反,为取消行号! |

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -0,0 +1,382 @@
# 05.文件属性与文件查找
## 05.文件属性与文件查找
### 1. 文件时间
任何一个操作系统都有时间的概念时间的概念主要用于对文件和系统中发生的时间进行记录在Linux中可以使用stat查看Linux系统中文件的时间
#### 1.1 stat
用于显示文件时间和 inode 内容inode相关的知识会在后面的磁盘管理章节详细讲解这边主要来看文件的时间
```shell
stat [选项]... 文件...
```
##### 1.1.1 实例
* stat查看文件时间这边为了我们方便看得懂建议改为英文系统环境
```shell
[root@localhost ~]# export LANG="en_US.UTF-8"
# 改回中文是LANG="zh_CN.UTF-8"
[root@localhost ~]# stat anaconda-ks.cfg 
  File: anaconda-ks.cfg
  Size: 1241      Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d Inode: 33574979    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2021-04-04 17:54:09.700844151 +0800
Modify: 2021-04-04 16:53:30.524854041 +0800
Change: 2021-04-04 16:53:30.524854041 +0800
 Birth: -
```
* **Access访问时间也叫atime**
* 当文件被访问的时候,这个时间就会发生改变
* Linux文件运行的时候查看文件又频繁数量又大如果每次atime发生变化的时候都记入硬盘或造成很大的压力。RHEL6开始relatimeatime延迟修改必须满足其中一个条件
* 自上次atime修改后已达到86400秒
* 发生写操作时
* **Modify修改时间也叫mtime**
* 当文件内容发生变化的时候,这个时间就会发生改变
* **Change改变时间也叫ctime**
* 当文件状态被改变的时候,这个时间就会发生修改
### 2. 文件类型
Linux系统和Windows系统有很大的区别Windows系统查看文件的后缀名就可以知道这个是什么类型的文件比如`test.jpg`这个是一个图片如果你在windows上双击打开就会使用支持查看图片的软件打开。
Linux系统就根本不看文件的后缀名你认为这个是什么文件你就使用什么工具打开这个文件如果打开错误就会报错看下面的案例
```shell
[root@localhost ~]# cat file
cat: file: Is a directory
```
当你以为file是个文件使用cat命令查看的时候cat会提示你这个是个文件夹你才反应过来应该使用cd命令打开。
所以在Linux中我们需要使用和windows不一样的方法来判断这个文件的类型。
#### 2.1 方法一ls
使用ls可以查看当前目录下有哪些文件我们会发现文件夹和文件的颜色并不一样所以我们可以简单的通过颜色来进行判断不过这种判断的方式并不准确因为不同的Linux发行套件颜色的标准并不一样不同的远程管理工具对颜色的理解也有偏差比如可能把蓝色显示为淡蓝色而淡蓝色又显示成其他颜色。所以最推荐的做法是通过`ls -l`查看第一个字母:
* **-**普通文件(文本文档,二进制文件,压缩文件,电影,图片。。。)
* **d**目录文件(蓝色)
* **b**块设备文件(块设备)存储设备硬盘U盘 /dev/sda,/dev/sda1
* **c**字符设备文件(字符设备)打印机,终端 /dev/tty1,/dev/zero
* **s**套接字文件
* **p**管道文件
* **l**链接文件(淡蓝色)
```shell
[root@localhost ~]# type ll
ll 是 `ls -l --color=auto' 的别名
[root@localhost ~]# ll -d /etc/hosts /bin/ls /home /dev/nvme0n1 /dev/tty1 /etc/grub2.cfg /dev/log
-rwxr-xr-x. 1 root root 140872 4月 21 2024 /bin/ls
lrwxrwxrwx. 1 root root 28 11月 8 21:42 /dev/log -> /run/systemd/journal/dev-log
brw-rw----. 1 root disk 259, 0 11月 8 21:42 /dev/nvme0n1
crw--w----. 1 root tty 4, 1 11月 8 21:42 /dev/tty1
lrwxrwxrwx. 1 root root 22 9月 5 03:00 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--. 1 root root 158 6月 23 2020 /etc/hosts
drwxr-xr-x. 10 root root 124 11月 8 09:57 /home
```
对于初学者而言,我们现在只要知道可以通过这样的方式查看文件的类型,并且能够知道`-``d`的意思即可。后面在学习的过程中,会慢慢的将所有文件类型都掌握的。
#### 2.2 方法二file
file是专门用来查看文件的类型的命令有时候也可以使用
```shell
[root@localhost ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@localhost ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
[root@localhost ~]# file /dev/nvme0n1
/dev/nvme0n1: block special (259/0)
[root@localhost ~]# file /dev/tty1
/dev/tty1: character special
[root@localhost ~]# file /etc/grub2.cfg 
/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
[root@localhost ~]# file /home
/home: directory
[root@localhost ~]# file /run/dmeventd-client
/run/dmeventd-client: fifo (named pipe)
```
#### 2.3 方法三stat
这个命令上面已经介绍过了,在输出结果中也是可以看到文件的类型
### 3. 文件查找
在windows中可以在文件管理器中很方便的输入文件名查找文件然而Linux的文件查找功能更加的方便并且功能更加的强大现在就介绍三个用于查找文件的命令。
在这三种查找命令中功能最强大的是`find`命令,所以在学习的时候,`which``locate`需要掌握,`find`命令需要熟练掌握!
#### 3.1 which
用于查找文件
which指令会在环境变量`$PATH`设置的目录里查找符合条件的文件
```shell
which [文件...]
```
##### 3.1.1 补充知识:环境变量
环境变量environment variables一般是指在操作系统中用来指定操作系统运行环境的一些参数临时文件夹位置和系统文件夹位置等。
简单的理解就是告诉操作系统在程序运行的时候,有一些默认的设置是什么。
比如上面我们修改了`LANG`变量,就是一个环境变量,会影响到显示的语言是中文还是英文。
比如在讲解`pwd`命令的时候,我们修改了`$PWD`变量,就影响了当前所处的文件夹。
在我们使用shell命令行输入命令的时候其实每个命令都是有一个可执行文件去完成我们下达的任务这个可执行文件在操作系统中是分布在不同的文件夹中的我们总不能每次执行的时候都要告诉操作系统这个文件在哪里那么就算是查看一个文件我们都需要输入如下的命令
```shell
[root@localhost ~]# /usr/bin/ls -lh
# 在Linux中ls的可执行程序在/usr/bin目录下
```
这样就太麻烦了,所以就指定了一个环境变量`$PATH`,这个变量中有很多的目录地址,当我们执行命令的时候,操作系统就会到这些目录中查找,是否存在你所输入的命令。如果有那么就会去执行。
```shell
[root@localhost ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
```
如果你想让自己安装的某个软件可以在操作系统的任意位置直接输入文件名执行,那么你也可以把自定义的目录加入到这个`$PATH`
##### 3.1.2 实例
* 查看ls命令的可执行文件在什么目录
```shell
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
# which会先告诉你ls其实是一个别名
# 然后显示出来ls所在的具体位置
```
**小知识**:我们在执行`ls`的时候,其实执行的是`ls --color=auto`这条命令,在显示文件的时候使用不同的颜色表示不同的文件类型,如果我们想执行`ls`本体,而不想执行别名,我们可以输入`\ls`就可以了,这样就不会有不同的颜色表示文件类型了。
* 查看poweroff在什么目录
```shell
[root@localhost ~]# which poweroff
/usr/sbin/poweroff
```
#### 3.2 locate
用于查找符合条件的文件,他会去保存文件和目录名称的数据库内,查找合乎范本样式条件的文件或目录
在centos7的最小化安装中并没有自带locate命令我们需要输入如下命令进行安装。
```shell
[root@localhost ~]# yum -y install mlocate
# 注意,在安装的时候需要确保虚拟机有网络
```
locate的使用方式如下
```shell
locate [选项]... [范本样式]...
```
在使用locate之前需要更新一下数据库因为locate只会在数据库中查找文件所在的位置所以locate查找速度极快缺点就是数据库更新并不是实时的更新数据库有两种方式
* 手动更新,输入`updatedb`
* 默认情况下,`updatedb`会每天自动执行一次
##### 3.2.1 选项
* **-c**:只输出找到的数量
* **-n**:至多显示 n个输出
* **-i**:忽略大小写
* **-r**:使用基本正则表达式
* **--regex**:使用扩展正则表达式
* **-d DBPATH**:使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
##### 3.2.2 实例
* 查找passwd文件所在的位置
```shell
[root@localhost ~]# updatedb
# 更新数据库并不是每次查找都需要,但是建议更新数据库来保证数据是最新的
[root@localhost ~]# locate passwd
```
* 查找ens33网卡配置文件所在的位置
```shell
[root@localhost ~]# locate -r ens160
/etc/NetworkManager/system-connections/ens160.nmconnection
/var/lib/NetworkManager/internal-73f5c862-c736-361f-a8f7-bcb21e280e90-ens160.lease
```
#### 3.3 find
实时查找工具,通过遍历指定路径下的文件系统完成文件查找
工作特点:
* 查找速度略慢
* 精确查找
* 实时查找
* 可以满足多种条件匹配
```shell
find [选项] [路径] [查找条件 + 处理动作]
查找路径:指定具体目录路径,默认是当前文件夹
查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
处理动作:对符合条件的文件做什么操作,默认输出屏幕
```
##### 3.3.1 查找条件
* 根据文件名查找
```shell
[root@localhost ~]# find /etc -name "ens160.nmconnection"
[root@localhost ~]# find /etc -iname "ens160.nmconnection" # 忽略大小写
[root@localhost ~]# find /etc -iname "ens*"
```
* 按文件大小
```shell
[root@localhost ~]# find /etc -size +5M # 大于5M
[root@localhost ~]# find /etc -size 5M # 等于5M
[root@localhost ~]# find /etc -size -5M # 小于5M
[root@localhost ~]# find /etc -size +5M -ls # 找到的处理动作-ls
```
* 指定查找的目录深度
```shell
[root@localhost ~]# find / -maxdepth 3 -a -name "ens160.nmconnection" # 最大查找深度
# -a是同时满足-o是或
[root@localhost ~]# find / -mindepth 3 -a -name "ens160.nmconnection" # 最小查找深度
```
* 按时间找
```shell
[root@localhost ~]# find /etc -mtime +5 # 修改时间超过5天
[root@localhost ~]# find /etc -mtime 5 # 修改时间等于5天
[root@localhost ~]# find /etc -mtime -5 # 修改时间5天以内
```
* 按照文件属主、属组找,文件的属主和属组,会在下一篇详细讲解。
```shell
[root@localhost ~]# find /home -user xwz # 属主是xwz的文件
[root@localhost ~]# find /home -group xwz
[root@localhost ~]# find /home -user xwz -group xwz
[root@localhost ~]# find /home -user xwz -a -group root
[root@localhost ~]# find /home -user xwz -o -group root
[root@localhost ~]# find /home -nouser # 没有属主的文件
[root@localhost ~]# find /home -nogroup # 没有属组的文件
```
* 按文件类型
```shell
[root@localhost ~]# find /dev -type d
```
* 按文件权限,文件权限会在下一篇详细讲解
```shell
[root@localhost ~]# find / -perm 644 -ls
[root@localhost ~]# find / -perm -644 -ls # 权限小于644的
```
* 按正则表达式
```shell
[root@localhost ~]# find /etc -regex '.*ens[0-9][0-9][0-9].*'
# .* 任意多个字符
# [0-9] 任意一个数字
```
* 条件组合
* **-a**多个条件and并列
* **-o**多个条件or并列
* **-not**:条件取反
##### 3.3.2 处理动作
* **print**:默认的处理动作,显示至屏幕
* **ls**:类型于对查找到的文件执行`ls l`命令
* **delete**:删除查找到的文件
* **fls /path/to/somefile**:查找到的所有文件的长格式信息保存至指定文件中
* **{}**:用于引用查找到的文件名称自身
* **-exec**选项允许您对找到的每个文件执行一个命令
下面的实例大家学习完后续用户权限管理之后,就可以完全看的懂了
##### 3.3.3 实例
- 查找到root目录下面以.log结尾的文件并且复制到/home/dir1中
```sh
[root@localhost ~]# find /root -name "*.log" -exec mv {} /home/dir1 \;
```
* 查找/var目录下属主为root且属组为mail的所有文件或目录
```shell
[root@localhost ~]# find /var -user root -group mail
```
* 查找/usr目录下不属于rootbin或ftp用户的所有文件或目录
```shell
[root@localhost ~]# find /usr -not -user root -a -not -user bin -a -not -user ftp
[root@localhost ~]# find /usr -not \( -user root -o -user bin -o -user ftp \)
```
* 查找/etc目录下最近一周内容曾被修改过的文件或目录
```shell
[root@localhost ~]# find /etc -mtime -7
```
* 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
```shell
[root@localhost ~]# find / \( -nouser -o -nogroup \) -a -atime -7
```
* 查找/etc目录下大于1M且类型为普通文件的所有文件或目录
```shell
[root@localhost ~]# find /etc -size +1M -type f
```
* 查找/etc目录下所有用户都没有写权限的文件
```shell
[root@localhost ~]# find /etc -not -perm /222
```
* 查找/etc目录下至少一类用户没有执行权限的文件
```shell
[root@localhost ~]# find /etc -not -perm -111
```
* 查找/etc/init.d目录下所有用户都有执行权限且其它用户写权限的文件
```shell
[root@localhost ~]# find /etc/init.d -perm -113
```

View File

@@ -0,0 +1,649 @@
# 06.用户权限管理
## 06.用户权限管理
Linux系统是一个多用户多任务的分时操作系统任何一个要使用系统资源的用户都必须首先向系统管理员申请一个账号然后以这个账号的身份进入系统。
为了更加方便的管理多个用户,就出现了用户组的概念,关于用户和用户组:
* 系统上的每个进程(运行的程序)都是作为特定用户运行
* 每个文件是由一个特定的用户拥有
* 访问文件和目录受到用户的限制
* 与正在运行的进程相关联的用户确定该进程可访问的文件和目录
实现用户账号的管理,要完成的工作主要有如下几个方面:
* 用户账号的添加、删除与修改
* 用户口令的管理
* 用户组的管理
### 1. 用户和用户组查看
#### 1.1 id
用于显示用户的ID以及所属群组的ID
id会显示用户以及所属群组的实际与有效ID。若两个ID相同则仅显示实际ID。若仅指定用户名称则显示目前用户的ID。
```shell
id [OPTION]... [USER]
```
* **-g**显示用户所属群组的ID。
* **-G**显示用户所属附加群组的ID。
* **-n**:显示用户,所属群组或附加群组的名称。
* **-r**显示用户真实ID用户真实的uid。
* **-u**显示用户有效ID可以都某些高权限用户通过有效id限制权限。
##### 1.1.1 uid的约定
Linux操作系统会依据用户的uid数值来判定这个用户的角色分别如下
* **0**超级管理员也就是root在linux系统中拥有所有权力
* **1~999**:系统用户,系统用户往往是用来约束系统中的服务的
* **1000+**普通用户可以用来登陆和使用Linux操作系统
关于root用户
* uid是0
* 拥有操作系统所有权力
* 该用户有权力覆盖文件系统上的普通权限
* 安装或删除软件并管理系统文件和目录
* 大多数设备只能由root控制
##### 1.1.2 实例
* 查看当前登陆的用户信息
```shell
[root@localhost ~]# id
uid=0(root) gid=0(root) =0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
```
* 查看文件的拥有者
```shell
[root@localhost ~]# ll anaconda-ks.cfg 
-rw-------. 1 root root 1241 4月   4 16:53 anaconda-ks.cfg
```
![img](06.用户权限管理/Fx6dmHzgAk0fq4CO.png!thumbnail)
* 查看运行进程的用户名ps命令会在后面进程管理部分讲解
```shell
[root@localhost ~]# ps aux
USER PID %CPU %MEM    VSZ   RSS TTY STAT START   TIME COMMAND
root 2  0.0  0.0      0     0 ? S    09:06   0:00 [kthreadd]
root 3  0.0  0.0      0     0 ? S    09:06   0:01 [ksoftirqd/0]
root 4  0.1  0.0      0     0 ? R    09:06   0:09 [kworker/0:0]
root 5  0.0  0.0      0     0 ? S<   09:06   0:00 [kworker/0:0H]
```
#### 1.2 相关的文件
之前说过Linux一切皆文件所以用户和用户组相关的信息也都是保存在文本文件中的下面列举出相关的文件。
##### 1.2.1 passwd文件
用于保存用户的信息一般第一行是root用户下面都是其他用户
```shell
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 这个格式为用户名:密码:uid:gid:描述:家目录:登陆后执行的命令
```
##### 1.2.2 shadow文件
格式中密码占位置太长了所以使用x来替代Linux系统会到shadow中查找x部分的的密码内容
```shell
[root@localhost ~]# head -n 1 /etc/shadow
root:$6$frokclXSnQa8EbKs$pWElbjPlmxjYh30tr8qLsTQVOhuPg7GmW9Sanm2yXAK8TNMgje1gyc/vwPgqvmSMf6VaoEvveM0gFvtETmXy/.::0:99999:7:::
# 这个格式为用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
```
格式不需要大家记住,只需要知道关于这个用户的密码和有效期都在这个文件中即可。
密码在`passwd`文件中会使用加密算法加密,所以别想知道我的密码是什么,加密算法默认是`$6`这个类型6的加密算法是sha-512。我们也可以在man手册中看到对shadow文件的详细解释。
```shell
[root@localhost ~]# man 5 shadow
# man手册一个有9个章节其中第5个章节是对文件格式的说明
# 对man手册感兴趣的同学也可以自己在网上查找学习man手册的更多内容
```
##### 1.2.3 group文件
用户和组的对应关系会保存在group文件中
```shell
[root@localhost ~]# head -n 1 /etc/group
root:x:0:
# 这个格式是组名:口令:组标识号:组内用户列表
```
### 2. 用户组管理
#### 2.1 添加用户组groupadd
groupadd 命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中
```shell
groupadd [选项]
```
##### 2.1.1 选项
* **-g**:指定新建工作组的 id
* **-r**创建系统工作组系统工作组的组ID小于 500
* **-K**:覆盖配置文件`/etc/login.defs`
* **-o**:允许添加组 ID 号不唯一的工作组。
* **-f**:如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用并且指定的GID_MIN已经存在时选择另一个唯一的GID即-g关闭
##### 2.1.2 实例
* 按照下图创建组并且指定gid并且检查是否成功
![img](06.用户权限管理/uMr1eOHxTqG6CmoS.png!thumbnail)
```shell
[root@localhost ~]# groupadd hr -g 1000
[root@localhost ~]# groupadd sale -g 2000
[root@localhost ~]# groupadd it -g 3000
[root@localhost ~]# groupadd fd -g 4000
[root@localhost ~]# tail -n 4 /etc/group
hr:x:1000:
sale:x:2000:
it:x:3000:
fd:x:4000:
```
#### 2.2 修改用户组groupmod
groupmod命令用于更改群组识别码或名称
```shell
groupmod [选项]
```
##### 2.2.1 选项
* **-g**:将组 ID 改为 GID
* **-n**:改名为 NEW_GROUP
* **-o**:允许使用重复的 GID
##### 2.2.2 实例
* 修改fd组的名字为finance
```shell
[root@localhost ~]# groupmod -n finance fd
[root@localhost ~]# tail -n 1 /etc/group
finance:x:4000:
```
#### 2.3 删除用户组groupdel
groupdel命令用于删除群组
需要从系统上删除群组时可用groupdel(group delete)指令来完成这项工作。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
```shell
groupdel [组名]
```
##### 2.3.1 实例
* 删除一个用户组
```shell
[root@localhost ~]# groupadd test
[root@localhost ~]# groupdel test
```
#### 2.4 用户组成员管理gpasswd
gpasswd 是 Linux 下工作组文件 /etc/group 和 /etc/gshadow 管理工具,用于将一个用户添加到组或者从组中删除
```shell
gpasswd [选项]
```
##### 2.4.1 选项
* **-a**:添加用户到组;
* **-d**:从组删除用户;
* **-A**:指定管理员,可以执行添加或者删除组员;
* **-M**:替换组中的全部用户列表,不包含在内的用户将会从组中删除;
* **-R**限制用户登入组只有组中的成员才可以用newgrp加入该组。
##### 2.4.2 实例
* 创建用户itadmin并且将其加入it组
```shell
[root@localhost ~]# useradd itadmin
[root@localhost ~]# gpasswd -a itadmin it
正在将用户“itadmin”加入到“it”组中
[root@localhost ~]# cat /etc/group |grep it:
it:x:3000:itadmin
# 在组文件中,可以看到这个组的成员
[root@localhost ~]# id itadmin
uid=6667(itadmin) gid=6667(itadmin) =6667(itadmin),3000(it)
# 在用户的信息中,可以看到这个用户的所属组
```
### 3. 用户管理
#### 3.1 添加用户useradd
useradd可以用来添加新的用户账号
```shell
useradd [选项] 用户名
```
##### 3.1.1 选项
* **-c comment**:指定一段注释性描述。
* **-d 目录**:指定用户主目录,如果此目录不存在,则同时使用-m选项可以创建主目录。
* **-m**:创建用户的主目录
* **-g 用户组**:指定用户所属的用户组,默认会创建一个和用户名同名的用户组。
* **-G 用户组**:用户组 指定用户所属的附加组,一个用户可以属于多个附加组。
* **-s Shell文件**指定用户的登录Shell。
* **-u 用户号**:指定用户的用户号,如果同时有-o选项则可以重复使用其他用户的标识号。
##### 3.1.2 实例
* 添加一般用户
```shell
[root@localhost ~]# useradd user01
```
* 为添加的用户指定相应的用户组
```shell
[root@localhost ~]# useradd -g root user02
```
* 为新添加的用户指定home目录
```shell
[root@localhost ~]# useradd -d /home/test user03
```
* 建立一个不给登录的用户
```shell
[root@localhost ~]# useradd -s /sbin/nologin user04
```
- 查看用户描述信息
```bash
[root@localhost ~]# useradd -c "this is python_developmer user" python-developmer
[root@localhost ~]# cat /etc/passwd |grep python-developmer
python-developmer:x:1005:1005:this is python_developmer user:/home/python-developmer:/bin/bash
```
#### 3.2 切换用户su
su命令用户Linux系统中的用户切换
##### 3.2.1 用法:
```BASH
su [选项] 用户名
```
##### 3.2.2 常用选项:
- `-`:以目标用户的环境变量启动新会话。这将模拟用户完全登录到新用户账户,包括其家目录、环境变量等。
- `-c 命令`:执行指定的命令,并在执行完毕后返回原始用户。
- `-s shell`:使用指定的 shell 替代目标用户的默认 shell。
#### 3.3 修改用户usermod
usermod命令用于修改用户帐号
usermod可用来修改用户帐号的各项设定
```shell
usermod [选项] 登录
```
##### 3.3.1 选项
* **-c<备注>**:修改用户帐号的备注文字。
* **-a**:追加,默认的修改是覆盖
* **-d登入目录>**:修改用户登入时的目录。
* **-e<有效期限>**:修改帐号的有效期限。
* **-f<缓冲天数>**:修改在密码过期后多少天即关闭该帐号。
* **-g<群组>**:修改用户所属的群组。
* **-G<群组>**:修改用户所属的附加群组。
* **-l<帐号名称>**:修改用户帐号名称。
* **-L**:锁定用户密码,使密码无效。
* **-s**修改用户登入后所使用的shell。
* **-u**修改用户ID。
* **-U**:解除密码锁定。
##### 3.3.2 实例
* 更改登录的目录
```shell
[root@localhost ~]# usermod -d /home user01
[root@localhost ~]# su - user01
[user01@localhost ~]$ pwd
/home
```
* 改变用户的uid
```shell
[root@localhost ~]# usermod -u 6666 user02
```
#### 3.4 删除用户userdel
userdel命令用于删除用户帐号
userdel可删除用户帐号与相关的文件。若不加参数则仅删除用户帐号而不删除相关文件
```shell
userdel [-r][用户帐号]
```
##### 3.4.1 选项
* **-r**:删除用户登入目录以及目录中所有文件
##### 3.4.2 实例
* 删除用户账号
```shell
[root@localhost ~]# userdel user04
```
* 删除用户账户和家目录
```shell
[root@localhost ~]# userdel -r user03
```
### 4. passwd文件中的shell
查看`/etc/passwd`文件会发现在每行的最后是登录成功之后执行的命令,有两种是使用最为频繁的:
* /bin/bash这个是Linux的命令行工具我们正常登陆之后默认就是进入命令行
* /sbin/nologin如果写成nologin那么用户将无法登录有些用户是作为进程权限管理而存在的不需要登录。如果提供登录的功能反而不安全所以写成nologin
```shell
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
```
我们可以新建一个用户,然后尝试自定义登录成功之后执行的命令,用来加深印象。
```shell
[root@localhost ~]# useradd test01
[root@localhost ~]# tail -n 1 /etc/passwd
test01:x:1000:1000::/home/test01:/bin/vi
```
切换到test01用户会发现自动进入vi的界面说明最后的这个段内容就是用户登录之后会运行的程序
![img](06.用户权限管理/xAgZdlGg8OXMi9mn.png!thumbnail)
### 5. 用户密码管理
root用户可以直接设置普通用户密码普通用户必须要提供原密码才可以修改自己密码。
#### 5.1 passwd
passwd命令用来更改使用者的密码
```shell
passwd [选项...] <帐号名称>
```
##### 5.1.1 选项
* **-k**:保持身份验证令牌不过期
* **-d**:删除已命名帐号的密码(只有根用户才能进行此操作)
* **-l**:锁定指名帐户的密码(仅限 root 用户)
* **-u**:解锁指名账户的密码(仅限 root 用户)
* **-x**:密码的最长有效时限(只有根用户才能进行此操作)
* **-n**:密码的最短有效时限(只有根用户才能进行此操作)
* **-w**:在密码过期前多少天开始提醒用户(只有根用户才能进行此操作)
* **-i**:当密码过期后经过多少天该帐号会被禁用(只有根用户才能进行此操作)
* **-S**:报告已命名帐号的密码状态(只有根用户才能进行此操作)
* **--stdin**:从标准输入读取令牌(只有根用户才能进行此操作)
##### 5.1.2 实例
* 修改test01用户密码
```shell
[root@localhost ~]# passwd test01
更改用户 test01 的密码 。
新的 密码:
重新输入新的 密码:
passwd所有的身份验证令牌已经成功更新。
```
* 使用管道符设置用户密码
```shell
[root@localhost ~]# echo 123456 | passwd --stdin test01
更改用户 test01 的密码 。
passwd所有的身份验证令牌已经成功更新。
```
#### 5.2 login.defs文件
`/etc/login.defs`文件是用来创建用户时进行一定的限制,但是优先级低于`/etc/passwd``/etc/shadow`,如果有冲突的地方,系统会以`/etc/passwd``/etc/shadow`为准
下面是这个文件的内容egrep命令我们后续会讲到这边可以理解为不看文件的注释和空行。
```shell
[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/login.defs
MAIL_DIR /var/spool/mail # 系统消息(邮件)文件夹
PASS_MAX_DAYS 99999 # 密码有效最大天数 
PASS_MIN_DAYS 0 # 密码有效最小天数
PASS_MIN_LEN 5 # 密码长度
PASS_WARN_AGE 7 # 密码失效警告倒计时
UID_MIN                  1000 # 用户UID最小1000
UID_MAX                 60000 # 用户UID最大60000
SYS_UID_MIN               201 # 系统用户UID最小201
SYS_UID_MAX               999 # 系统用户UID最大999
GID_MIN                  1000 # 用户组GID最小1000
GID_MAX                 60000 # 用户组GID最大60000
SYS_GID_MIN               201
SYS_GID_MAX               999
CREATE_HOME yes # 创建家目录
UMASK           077 # 创建文件/目录的权限掩码
USERGROUPS_ENAB yes # 创建用户时同时生成组是  如果此处是no 创建的用户 会是gid=100(users)groups=100(users) 
ENCRYPT_METHOD SHA512 # 加密  方法  sha 512 这个方法生成的密码在/etc/shadow里面的第二列会以$6$开头
```
#### 5.3 chage
chage是用于更改用户密码过期信息
```shell
chage [选项] 登录
```
##### 5.3.1 选项
* **-d**:设置密码的最后更改日期
* **-E 过期日期**:设置账号的过期日期
* **-I INACITVE**:设置密码过期后若未更改,多少天后用户账号被禁用。
* **-l**:显示用户账号的密码过期信息。
* **-m 最小天数**:设置两次改变密码之间相距的最小天数
* **-M 最大天数**:设置将两次改变密码之间相距的最大天数
* **-W 警告天数**:设置密码过期前的警告天数
##### 5.3.2 实例
* 强制用户在下次登录的时候换密码
```shell
[root@localhost ~]# chage -d 0 test01
[root@localhost ~]# logout
You must change your password now and login again!
更改用户 test01 的密码 。
为 test01 更改 STRESS 密码。
当前UNIX 密码:
[root@localhost ~]# chage -l root
最近一次密码修改时间 :从不
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 0
两次改变密码之间相距的最大天数 99999
在密码过期之前警告的天数 7
# 设置用户 user01 的密码过期前7天提醒用户修改密码
[root@localhost ~]# chage -W 7 user01
# 设置用户 user01 的密码最短使用天数为7天即密码修改后7天内不能再次修改
[root@localhost ~]# chage -m 7 user01
[root@localhost ~]# chage -l user01
最近一次密码修改时间 11月 08, 2024
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 7
两次改变密码之间相距的最大天数 99999
在密码过期之前警告的天数 7
```
**小知识:**当你新建用户的时候用户的home目录下会有一些默认的隐藏文件这些隐藏文件是在创建用户的时候从`/etc/skel/`中复制过去的。
### 6. sudoers
Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。
sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码就可以提权到root执行一些root才能执行的命令。
```shell
sudo [选项] [用户名] [命令]
```
#### 6.1 sudo命令执行过程
1. 当用户执行sudo时系统会主动寻找`/etc/sudoers`文件判断该用户是否有执行sudo的权限
2. 确认用户具有可执行sudo的权限后让用户输入用户自己的密码确认
3. 若密码输入成功则开始执行sudo后续的命令
#### 6.2 赋予用户sudo操作的权限
通过useradd添加的用户并不具备sudo权限。在ubuntu/centos/RockyLinux等系统下, 需要将用户加入admin组或者wheel组或者sudo组。以root用户身份执行如下命令, 将用户加入wheel/admin/sudo组。
```shell
usermod -a -G wheel <用户名>
```
如果提示wheel组不存在, 则还需要先创建该组
```shell
groupadd wheel
```
#### 6.3 配置文件
sudo的权限控制可以在`/etc/sudoers`文件中查看到。一般来说通过cat /etc/sudoers指令来查看该文件, 会看到如下几行代码。
```shell
[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/sudoers
=====省略=====
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
```
对/etc/sudoers文件进行编辑的代码公式可以概括为
```shell
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1 字段2 =[(字段3)] [字段4] 字段5
```
凡是[ ]中的内容, 都能省略; 命令和命令之间用`,`号分隔字段3、字段4是可以省略的。
* "字段1"不以%号开头的表示"将要授权的用户",以%号开头的表示"将要授权的组"。
* "字段2"表示允许登录的主机, ALL表示所有;如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
* "字段3"如果省略, 相当于(root:root)表示可以通过sudo提权到root如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)。
* "字段4"的可能取值是NOPASSWD:。请注意NOPASSWD后面带有冒号:。表示执行sudo时可以不需要输入密码。
* 比如:`lucy ALL=(ALL) NOPASSWD: /bin/useradd`表示: 普通用户lucy可以在任何主机上, 通过sudo执行/bin/useradd命令, 并且不需要输入密码
* 比如:`peter ALL=(ALL) NOPASSWD: ALL`,表示: 普通用户peter可以在任何主机上, 通过sudo执行任何命令, 并且不需要输入密码。
* "字段5"是使用逗号分开一系列命令,这些命令就是授权给用户的操作; ALL表示允许所有操作。命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。
* 如果你将授权写成如下安全性欠妥的格式:`lucy ALL=(ALL) chown,chmod,useradd`那么用户就有可能创建一个他自己的程序, 也命名为userad, 然后放在它的本地路径中, 如此一来他就能够使用root来执行这个"名为useradd的程序"。这是相当危险的!
#### 6.4 编辑配置文件
在实践中,去编辑`/etc/sudoers`文件,系统提示我没权限,这是因为`/etc/sudoers`的内容如此敏感,以至于该文件是只读的。所以,编辑该文件前,请确认清楚你知道自己正在做什么。
强烈建议通过`visudo`命令来修改该文件,通过`visudo`修改,如果配置出错,会有提示。
官方文档推荐的做法,不是直接修改`/etc/sudoers`文件,而是将修改写在`/etc/sudoers.d/`目录下的文件中。如果使用这种方式修改sudoers需要在`/etc/sudoers`文件的最后行,加上`#includedir /etc/sudoers.d`一行(默认已有)。需要注意,这个`#includedir /etc/sudoers.d`中的`#`并不是注释,请勿修改。
#### 6.5 sudo选项
* **-u**:以指定用户或 ID 运行命令(或编辑文件)
* **-l**:显示出自己(执行 sudo 的使用者)的权限
* **-b**:将要执行的指令放在后台执行
* **-i**: 以目标用户身份运行一个登录 shell可同时指定一条命令。相当于切换到root不过只需要用户自己的密码即可。
#### 6.6 实例
* 以管理员身份查看shadow文件
```shell
[root@localhost ~]# useradd user
[root@localhost ~]# echo 123456 | passwd --stdin user
[root@localhost ~]# usermod -a -G wheel user
[root@localhost ~]# su - user
[user@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[user@localhost ~]$ sudo -u root cat /etc/shadow
[sudo] user 的密码:
[user@localhost ~]$ sudo cat /etc/shadow
# sudo -u root用的比较多可以被精简为sudo
```
* 查看下列示例
```shell
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
```
* 表示: 用户papi能在所有可能出现的主机上, 提权到root下执行`/bin/chown`, 不必输入密码; 但运行`/usr/sbin/useradd`命令时需要密码
* 在具有sudo操作的用户下, 执行`sudo -l`可以查看到该用户被允许和被禁止运行的命令
* 查看下列示例
```shell
papi ALL=/usr/sbin/,/sbin/,!/usr/sbin/fdisk
```
* 命令前面加上!号表示取消该命令
* 用户papi在所有可能出现的主机上, 能够运行目录/usr/sbin和/sbin下所有的程序, 但fdisk除外。
* 默认情况下输入一次sudo可以保持15分钟不再要求输入密码如果想要延长这个时间可以修改配置文件
```shell
[root@localhost ~]# visudo
Defaults env_reset,pwfeedback,timestamp_timeout=60
# 这个是改成60分钟才会需要再次输入密码并且输入密码的时候会显示*号
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,547 @@
# 07.文件权限管理
## 07.文件权限管理
### 1. 文件权限
文件权限设置:可以赋予某个用户或组,能够以何种方式,访问某个文件
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。
为了保护系统的安全性Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:
* chown (change ownerp) 修改所属用户与组。
* chmod (change mode) 修改用户的权限。
在 Linux 中我们可以使用 ll 或者 ls l 命令来显示一个文件的属性以及文件所属的用户和组
![img](07.文件权限管理/wIaB0yxCbDLgvDTt.png!thumbnail)
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
![img](07.文件权限管理/QnuyL16CH36SIyYr.png!thumbnail)
从左至右用 0-9 这些数字来表示。
* 第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
* 第4-6位确定属组所有者的同组用户拥有该文件的权限第7-9位确定其他用户拥有该文件的权限。
* 其中,第 1、4、7 位表示读权限,如果用`r`字符表示,则有读权限,如果用`-`字符表示,则没有读权限;
* 第 2、5、8 位表示写权限,如果用`w`字符表示,则有写权限,如果用`-`字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用`x`字符表示,则有执行权限,如果用`-`字符表示,则没有执行权限。
### 2. 修改文件属主chown
chown用于设置文件所有者和文件关联组的命令
chown 需要超级用户`root`的权限才能执行此命令
```shell
chown [选项]... [所有者][:[]] 文件...
```
#### 2.1 选项
* **-R**: 处理指定目录以及其子目录下的所有文件
* **-v**: 显示详细的处理信息
#### 2.2 实例
* 设置所有者为root
```shell
[root@localhost ~]# chown root anaconda-ks.cfg
```
* 将文件的拥有者设置为user01允许使用的组设置为it
```shell
[root@localhost ~]# chown user01:it file.txt
```
* 将目录下的所有文件拥有者设置为user01允许使用的组设置为it
```shell
[root@localhost ~]# chown -R user01:it dir/*
```
### 3. 修改文件权限chmod
chmod是控制用户对文件的权限的命令
```shell
chmod [选项]... 模式[,模式]... 文件...
```
#### 3.1 模式
mode : 权限设定字串,格式如下 :
```shell
[ugoa...][[+-=][rwx]...][,...]
```
* `u`表示该文件的拥有者,`g`表示与该文件的拥有者属于同一个群体(group)者,`o`表示其他以外的人,`a`表示这三者皆是。
* `+`表示增加权限、`-`表示取消权限、`=`表示唯一设定权限。
* `r`表示可读取,`w`表示可写入,`x`表示可执行
* `r``w``x`权限对文件和目录的意义
| 权限 | 对文件的影响 | 对目录的影响 |
| :-------- | :------------------- | :--------------------------------------------------------- |
| r(读取) | 可以读取文件的内容 | 可以列出目录的内容(文件名)可以使用ls命令 |
| w(写入) | 可以更改文件的内容 | 可以创建或删除目录中的任一文件可以使用touch、rm命令 |
| x(可执行) | 可以作为命令执行文件 | 可以访问目录的内容(取决于目录中文件的权限)可以使用cd命令 |
#### 3.2 八进制语法
chmod命令可以使用八进制数来指定权限。文件或目录的权限位是由9个权限位来控制每三位为一组它们分别是文件所有者User的读、写、执行用户组Group的读、写、执行以及其它用户Other的读、写、执行。历史上文件权限被放在一个比特掩码中掩码中指定的比特位设为1用来说明一个类具有相应的优先级。
| # | 权限 | rwx | 二进制 |
| :--- | :------------- | :--- | :----- |
| 7 | 读 + 写 + 执行 | rwx | 111 |
| 6 | 读 + 写 | rw- | 110 |
| 5 | 读 + 执行 | r-x | 101 |
| 4 | 只读 | r-- | 100 |
| 3 | 写 + 执行 | -wx | 011 |
| 2 | 只写 | -w- | 010 |
| 1 | 只执行 | --x | 001 |
| 0 | 无 | --- | 000 |
例如, 765 将这样解释:
* 所有者的权限用数字表达:属主的那三个权限位的数字加起来的总和。如 rwx ,也就是 4+2+1 ,应该是 7。
* 用户组的权限用数字表达:属组的那个权限位数字的相加的总和。如 rw- ,也就是 4+2+0 ,应该是 6。
* 其它用户的权限数字表达:其它用户权限位的数字相加的总和。如 r-x ,也就是 4+0+1 ,应该是 5。
#### 3.3 选项
* **-f**: 若该文件权限无法被更改也不要显示错误讯息
* **-v**: 显示权限变更的详细资料
* **-R**: 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
#### 3.4 实例
* 限制用户user1对`file`文件的写入
```shell
[root@localhost ~]# chmod a-w /home/user1/file 
[root@localhost ~]# ls -lh /home/user1/file 
-r--r--r--. 1 user1 user1 0 4月  13 10:56 /home/user1/file
[root@localhost ~]# su - user1
上一次登录:二 4月 13 10:47:41 CST 2021pts/1 上
[user1@localhost ~]$ echo "hello world" >> file 
-bash: file: 权限不够
```
* 限制所有用户删除dir目录下的文件
```shell
[root@localhost ~]# chmod a-w /home/user1/dir/
[root@localhost ~]# ls -lhd /home/user1/dir
dr-xr-xr-x. 2 user1 user1 18 4月  13 10:58 /home/user1/dir
[root@localhost ~]# su - user1
上一次登录:二 4月 13 10:57:11 CST 2021pts/1 上
[user1@localhost ~]$ cd dir/
[user1@localhost dir]$ rm -rf test 
rm: 无法删除"test": 权限不够
```
### 4. 文件访问控制列表
文件访问控制列表Access Control ListsACL是Linux开的一套新的文件系统权限管理方法。
传统的Linux文件系统的权限控制是通过user、group、other与r、w、x执行的不同组合来实现的。随着应用的发展这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如我们可能需把一个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。
文件访问控制列表可以针对文件单独设置某个用户或者用户组队文件的管理权限。
#### 4.1 getfacl命名
获取文件访问控制列表的详细内容
```shell
getfacl [-aceEsRLPtpndvh] file ...
```
##### 4.1.1 选项
* **-a**:仅显示文件访问控制列表
* **-d**:仅显示默认的访问控制列表
* **-c**:不显示注释表头
* **-e**:显示所有的有效权限
* **-E**:显示无效权限
* **-R**:递归显示子目录
* **-t**:使用制表符分隔的输出格式
##### 4.1.2 实例
* 查看acl权限列表
```shell
[root@localhost ~]# getfacl anaconda-ks.cfg 
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
```
* 查看acl权限列表不显示注释表头
```shell
[root@localhost ~]# getfacl -c anaconda-ks.cfg 
user::rwx
group::r-x
other::r-x
```
#### 4.2 setfacl命令
用来设置更精确的文件权限
```shell
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
```
##### 4.2.1 选项
* **-m**:更改文件的访问控制列表
* **-M**:从文件读取访问控制列表条目更改
* **-x**:根据文件中访问控制列表移除条目
* **-X**:从文件读取访问控制列表条目并删除
* **-b**:删除所有扩展访问控制列表条目
* **-k**:移除默认访问控制列表
* **-d**:应用到默认访问控制列表的操作
* **-R**:递归操作子目录
##### 4.2.2 实例
* 给指定用户添加acl权限
* 首先用户user1是没有`/workdir`的权限的
```shell
[root@localhost ~]# groupadd worker
[root@localhost ~]# mkdir /workdir
[root@localhost ~]# chown root:worker /workdir
[root@localhost ~]# chmod 770 /workdir # 不允许其他用户对目录的权限
[root@localhost ~]# ll -d /workdir/
drwxrwx---. 2 root worker 6 4月  14 09:14 /workdir/
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
-bash: cd: /workdir/: 权限不够
```
* 单独给予user1的可读和可进入权限
```shell
[root@localhost ~]# setfacl -m u:user1:rx /workdir/
[root@localhost ~]# getfacl -c /workdir
user::rwx
user:user1:r-x # 成功添加user1对workdir的权限
group::rwx
mask::rwx
other::---
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ ll -d
drwxrwx---+ 2 root worker 6 4月  14 09:14 . # 权限位后面多了一个"+"表示存在ACL权限
[user1@localhost workdir]$ touch file
touch: 无法创建"file": 权限不够
```
* 移除user1的访问控制列表权限
```shell
[root@localhost ~]# setfacl -x u:user1 /workdir/
[root@localhost ~]# getfacl -c /workdir/
user::rwx
group::rwx
mask::rwx
other::---
```
* 创建worker2组然后给这个组访问acl的权限将user1加入worker2组验证是否成功
```shell
[root@localhost ~]# groupadd worker2
[root@localhost ~]# setfacl -m g:worker2:rwx /workdir
[root@localhost ~]# usermod -aG worker2 user1
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch file
```
* 对workdir设置的acl权限并不会被之后在workdir下创建的子文件和子目录继承可以设置默认ACL权限来让目录下面的新建文件和文件夹都继承父目录的权限
```shell
[root@localhost ~]# setfacl -b /workdir
[root@localhost ~]# setfacl -m d:u:user1:rx /workdir
# 在前面加上一个d,就可以设置默认facl权限
[root@localhost ~]# getfacl -c /workdir
user::rwx
group::rwx
other::---
default:user::rwx # 前面多出来了default
default:user:user1:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@localhost ~]# touch /workdir/newfile
[root@localhost ~]# getfacl -c /workdir/newfile 
user::rw-
user:user1:r-x #effective:r-- # 新建的文件会自动继承
group::rwx #effective:rw-
mask::rw-
other::---
```
### 5. mask有效权限
mask 权限,指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围,超出部分做无效处理。
注意上面的案例在newfile的facl中有一个mask权限是`rw-`所以我们即使给了user1`r-x`权限,在实际生效的时候,`x`也不会有的,注意后面的提示`#effective:r--`表示`x`权限并没有赋予。
#### 5.1 实例
* 修改上面案例中的newfile的mask权限
```shell
[root@localhost ~]# setfacl -m m::rwx /workdir/newfile 
[root@localhost ~]# getfacl -c /workdir/newfile 
user::rw-
user:user1:r-x
group::rwx
mask::rwx
other::---
```
### 6. 特殊权限
文件除了上述的`r`,`w``x`权限以外还有三个特殊权限suidsgidsticky
#### 6.1 suid
suid 属性只能运用在可执行文件上含义是开放文件所有者的权限给其他用户即当用户执行该执行文件时会拥有该执行文件所有者的权限。如果给一个非二进制文件文件附加suid权限则会显示大写S属于无效。
普通用户能够执行`passwd`命令修改自己的密码,修改密码其实就是修改`/etc/shadow`这个文件,查看`/etc/passwd`这个文件的权限,发现除了`root`其他人没有写权限,但是普通用户能够成功执行`passwd`,其原因就在于`passwd`这个命令的权限是`-rwsr-xr-x`,其中`s`的作用就是让执行命令的人具有和该命令拥有者相同的权限。
```shell
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
```
##### 6.1.1 实例
* 切换成普通用户输入修改密码命令
```shell
[root@localhost ~]# su - user1
[user1@localhost ~]$ passwd
更改用户 user1 的密码 。
为 user1 更改 STRESS 密码。
当前UNIX 密码:
```
* 保持这个会话别端口新建一个ssh会话查看系统进程可以看到当前是调用root用户执行的passwd命令
```shell
[root@localhost ~]# ps -aux |grep passwd
root 2031 0.0 0.3 14904 6656 pts/2 S+ 22:30 0:00 passwd
root 2034 0.0 0.1 3876 2048 pts/1 S+ 22:31 0:00 grep --color=auto passwd
```
* 如果想某个文件添加suid权限可以输入下面两个命令
```shell
chmod u+s file
chmod 4765 file
```
要设置特殊权限,可以使用`chmod`命令的4位数字表示法其中第一位用于特殊权限后三位分别代表所有者、组和其他用户的权限。特殊权限的设置如下
\- `4`: 设置setuid。
\- `2`: 设置setgid。
\- `1`: 设置sticky bit。
以下是一些设置特殊权限的例子:
\- 设置setuid: `chmod u+s file`
\- 设置setgid: `chmod g+s file`
\- 设置sticky bit: `chmod o+t /dir`
如果你想要将特殊权限与其他权限组合使用,可以这样:
\- 设置文件的setuid和可读可执行权限`chmod 4555 file`
\- 设置目录的setgid和可读可执行可进入权限`chmod 2775 /dir`
请注意,特殊权限的设置需要谨慎,因为它们可能会影响系统的安全性和文件的访问控制。通常,只有系统管理员或有经验的用户才会设置这些权限。
#### 6.2 sgid
sgid 属性可运用于二进制文件或者目录运用在文件的含义是开放文件所属组的权限给其他用户即当用户执行该执行文件时会拥有该执行文件所属组用户的权限。如果给一个非二进制文件文件附加sgid权限则会显示大写S属于无效。
运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样。即如果`/home/user1`目录具有sgid权限且所属组是`user1`,则任何用户在`/home/user1`下创建的子目录或者文件的所属组都是`user1`
##### 6.2.1 实例
* 设置sgid让用户在workdir下创建的文件都属于worker组
```shell
[root@localhost ~]# mkdir /workdir
[root@localhost ~]# groupadd worker
[root@localhost ~]# chown .worker /workdir/
[root@localhost ~]# ll -d /workdir/
drwxr-xr-x. 2 root worker 6 Nov 15 22:42 /workdir/
[root@localhost ~]# chmod g+s /workdir/
[root@localhost ~]# cd /workdir/
[root@localhost workdir]# touch file
[root@localhost workdir]# ll
total 0
-rw-r--r--. 1 root worker 0 Nov 15 22:44 file
```
#### 6.3 sticky
sticky 权限只能运用于目录上含义是该目录下所有的文件和子目录只能由所属者删除即使其的权限是777或者其他。一个公共目录每个人都可以创建文件删除自己的文件但不能删除别人的文件(仅对目录有效)。
##### 6.3.1 实例
* 设置sticky让普通用户只能创建文件不能删除文件
```shell
[root@localhost ~]# mkdir /workdir
[root@localhost ~]# chmod 1777 /workdir/
[root@localhost ~]# ll -d /workdir/
drwxrwxrwt. 2 root root 6 Nov 15 22:47 /workdir/
[root@localhost ~]# su - user1
[user1@localhost ~]$ cd /workdir/
[user1@localhost workdir]$ touch user1file
[user1@localhost workdir]$ exit
logout
[root@localhost ~]# useradd user2
[root@localhost ~]# su - user2
[user2@localhost ~]$ cd /workdir/
[user2@localhost workdir]$ rm -rf user1file # 不能删除别人的创建的文件
rm: cannot remove 'user1file': Operation not permitted
[user2@localhost workdir]$ touch user2file
[user2@localhost workdir]$ rm -rf user2file # 只能删除自己创建的文件
[user2@localhost workdir]$ ll
total 0
-rw-r--r--. 1 user1 user1 0 Nov 15 22:48 user1file
```
### 7. chattr文件属性
chattr命令用于改变文件属性。
这项指令可改变存放在文件或目录属性这些属性共有以下8种模式
* **a**:让文件或目录仅供追加用途
* **b**:不更新文件或目录的最后存取时间
* **c**:将文件或目录压缩后存放
* **i**:不得任意更动文件或目录
* **s**:保密性删除文件或目录
* **S**:即时更新文件或目录
* **u**:预防意外删除
```shell
chattr [-RV][+/-/=<属性>][文件或目录...]
```
#### 7.1 选项
* **-R**:递归处理,将指定目录下的所有文件及子目录一并处理
* **-v <版本编号>**:设置文件或目录版本
* **-V**:显示指令执行过程
* **+ <属性>**:开启文件或目录的该项属性
* **- <属性>**:关闭文件或目录的该项属性
* **= <属性>**:指定文件或目录的该项属性
#### 7.2 实例
* 用chattr命令防止系统中某个关键文件被修改
```shell
[root@localhost ~]# chattr +i /etc/resolv.conf
[root@localhost ~]# lsattr /etc/resolv.conf 
----i----------- /etc/resolv.conf
[root@localhost ~]# echo test >> /etc/resolv.conf
-bash: /etc/resolv.conf: 权限不够
```
* 让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件
```shell
[root@localhost ~]# chattr +a /var/log/messages 
[root@localhost ~]# lsattr /var/log/messages 
-----a---------- /var/log/messages
[root@localhost ~]# echo > /var/log/messages  # 不允许清空日志
-bash: /var/log/messages: 不允许的操作
```
### 8. umask
umask命令指定在建立文件时预设的权限掩码进程、新建文件、目录的默认权限会收到umask的影响umask表示要减掉得到权限。
umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成将现有的存取权限减掉权限掩码后即可产生建立文件时预设的权限。
```shell
umask [选项][权限掩码]
```
#### 8.1 选项
* **-S**:以文字的方式来表示权限掩码
#### 8.2 实例
* 查看当前用户的umask权限
```shell
[root@localhost ~]# umask
0022
```
* 查看最终有的权限
```shell
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
```
* 修改umask的数值(临时)
```shell
[root@localhost ~]# umask 0000
[root@localhost ~]# mkdir dir
[root@localhost ~]# ll
总用量 4
drwxrwxrwx. 2 root root    6 4月  14 11:25 dir
-rw-rw-rw-. 1 root root    0 4月  14 11:25 file
```
* 修改umask的数值(永久)
```shell
[root@localhost ~]# vim /etc/profile
--------------
 59 if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
 60     umask 002
 61 else
 62     umask 022
 63 fi
---------------
[root@localhost ~]# source /etc/profile        # 立即在当前shell中生效
```
* 通过umask决定新建用户`HOME`目录的权限
```shell
[root@localhost ~]# vim /etc/login.defs
-----------------
61 # The permission mask is initialized to this value. If not specified,
62 # the permission mask will be initialized to 022.
63 UMASK 077
------------------
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,454 @@
# 08.Linux网络管理
## 08.Linux网络管理
### 1. 数据通信基础
- 数据从产生到传递到目的地的过程中会经历好几个过程,每个过程都负责加工自己这部分的内容,类似于工厂流水线
- 目前我们只需要有个最基本的概念:
- IP地址是用来标识网络中位置的比如你在江苏省xxx市xxx路xxx号
- MAC地址是每个网络设备的唯一ID比如你的身份证号码
- 如果想要发送数据,必须(暂且认为必须)同时拥有IP和MAC地址
- Linux的网络管理基础部分就是需要大家掌握IP地址的配置
![image-20200614103051567](08.Linux网络管理/image-20200614103051567.png)
#### 1.1 IP地址
- 在IP网络中通信节点需要有一个唯一的IP地址
- IP地址用于IP报文的寻址以及标识一个节点
- IPv4地址一共32bits使用点分十进制的形式表示
![image-20200614132903507](08.Linux网络管理/image-20200614132903507.png)
- IPv4地址由网络位和主机位组成
- 网络位一致表示在同一个广播域中,可以直接通信
- 主机位用于在同一个局域网中标识唯一节点
##### 1.1.1 早期IP地址的划分
![image-20200614133037272](08.Linux网络管理/image-20200614133037272.png)
- 早期参与互联网的设备不多所以仅仅使用ABC类地址分配给用户即可
- 随着网络用户的增多ABC类分配地址过于浪费于是出现子网掩码方式划分网络位和主机位
##### 1.1.2 IP网络通信类型
- 单播(Unicast)
- 广播(Broadcast)
- 组播(Multicast)
##### 1.1.3 子网掩码(Netmask)
- 网络掩码与IP地址搭配使用用于描述一个IP地址中的网络部分及主机部分
- 网络掩码32bits与32bits的IP地址一一对应掩码中为1的位对应IP地址中的网络位掩码中为0的位对应IP地址中的主机位
![image-20200614133243651](08.Linux网络管理/image-20200614133243651.png)
- 减少一个局域网中的设备数量可以有效降低广播报文消耗资源
- 可变长子网掩码可以将一个局域网中的主机地址分配的更加小
![image-20200614133433026](08.Linux网络管理/image-20200614133433026.png)
##### 1.1.4 广播地址与网络号
- 在局域网中经常会有广播的需要(比如mac地址查询地址冲突检测等等)所以将主机位全为1的地址做为本局域网的广播地址(注意!广播并不能跨越不同的局域网)
- 在网络中需要表示整个局域网就像邮政编码表示一个大的区域一样所以将主机位全为0的地址作为本局域网的网络号用来代指整个网段
- 综上所述,计算产生的子网及每个子网的主机数量公式如下:
![image-20200614133755889](08.Linux网络管理/image-20200614133755889.png)
##### 1.1.5 私有IP地址
- 如果要取得互联网合法地址用于通信必须要找iana.org组织分配
- 很多企业内部都有大量的网络设备,大多数时候这些设备只需要内部通信即可
- 企业的网络管理员可以从如下网段中自行分配地址
![image-20200614134206448](08.Linux网络管理/image-20200614134206448.png)
- 私有IP地址空间中的地址不需要申请随意使用但是不能在互联网上与合法地址通信(因为对方没法回复你这个地址因为世界上私有IP地址段无数个重复的怎么知道回到谁那里呢)
- 而我们明明用的私有IP地址也可以上网因为我们需要先把自己的上网请求提交给网络中的网关(就是你家的出口路由器)再由网关代替我们去获取内容转交给我们的电脑手机而网关往往能从运营商那里得到一个合法的公有IP地址
### 2. DHCP
DHCP动态主机配置协议主要用于给设备自动的分配IP地址以及网络信息以便网络设备能够连接到网络并进行通信
DHCP给设备提供的信息如下
- IP地址
- 子网掩码
- 网关地址
- DNS服务器地址
- 租约时间
#### 2.1 DHCP工作过程
1. 客户端启动时发送 DHCP 发现(DHCPDISCOVER)广播消息,寻找 DHCP 服务器。
2. DHCP 服务器收到广播消息后,会提供一个未被使用的 IP 地址以及其他网络配置信息(如子网掩码、默认网关、DNS 服务器等),并发送 DHCP 提供(DHCPOFFER)消息给客户端。
3. 客户端收到一个或多个 DHCP 提供消息后,会选择其中一个 DHCP 服务器提供的 IP 地址,并发送 DHCP 请求(DHCPREQUEST)消息确认。
4. DHCP 服务器收到客户端的 DHCP 请求消息后,会将该 IP 地址分配给客户端,并发送 DHCP 确认(DHCPACK)消息给客户端。
5. 客户端收到 DHCP 确认消息后,就可以使用分配到的 IP 地址和其他网络配置参数连接到网络了。
`dhclient`
我们可以通过抓包软件捕捉到主机通过DHCP方式获取ip的过程一共有4个数据包
![image-20200616170847279](08.Linux网络管理/image-20200616170847279.png)
其中每个数据包的作用如下:
1. `Discover`消息是用于客户端向整个内网发送广播期待DHCP服务器进行回应
1. 这个数据包中的重要内容就是消息类型客户端ID主机名请求获得的信息
2. `Offer`消息是DHCP服务器对客户的回应
1. 这个消息中会回复对方所需要的所有信息
3. `Request`这个是客户端确认DHCP服务器的消息
1. 这个消息和第一个消息差不多,但是消息类别变为`Request`并且会携带请求的IP地址
4. `ACK`DHCP服务器给客户端的最终确认
1. 这个消息和第二个消息差不多,但是消息类型变为`ACK`
#### 2.2 DHCP续租
DHCP分配的信息是有有效期的再租约时间快到的时候如果我们想要继续使用这个地址信息就需要向DHCP服务器续租
这也是大家虚拟机上IP地址经常发生变化的原因这是因为虚拟机上默认就是以DHCP的方式获得IP地址的
我们可以查看Linux上的网络配置信息该信息位于`/etc/NetworkManager/system-connections/ens160.nmconnection`
```bash
[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=dfea55d8-6ddc-3229-8152-cb9e261de181
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1731149277
[ethernet]
[ipv4]
method=auto
[ipv6]
addr-gen-mode=eui64
method=auto
[proxy]
# 可以看到配置中的method字段是以dhcp来获得IP地址的。
```
同样从VMware的虚拟网络设置中也可以看到租约时间相关的内容
![image-20240524145622911](08.Linux网络管理/image-20240524145622911.png)
### 3. DNS域名解析
DNS(Domain Name System) 是一套从域名到IP的映射的协议
在网络世界中如果我们想要给某个机器或者是某个网站去发送一个数据都需要通过IP地址来找到对方比如我们想要使用百度来搜索东西就需要知道百度的IP地址换句话说只要知道了百度的IP地址我们就可以访问到百度
但是IP地址不易记忆不可能记住每一个网站的IP地址是什么于是早期的搞IT的那帮人研发出一个叫做主机名的东西。
最开始人们把IP和主机名的的对应关系记录在本地这个文件目前在windows系统的`C:\Windows\System32\drivers\etc\hosts`中。但是后面发现并不好用,而且需要经常手动更新这个文件。类似于黄历
随着主机名越来越多hosts文件不易维护所以后来改用**域名解析系统DNS**
- 一个组织的系统管理机构,维护系统内的每个主机的`IP和主机名`的对应关系
- 如果新计算机接入网络,将这个信息注册到`数据库`
- 用户输入域名的时候,会自动查询`DNS`服务器,由`DNS服务器`检索数据库, 得到对应的IP地址。
#### 3.1 域名
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。
例如http://www.baidu.com(域名使用.连接)
- com 一级域名,表示这是一个企业域名。同级的还有 "net"(网络提供商)"org"(非盈利组织) 等。
- baidu: 二级域名, 公司名。
- www: 只是一种习惯用法,并不是每个域名都支持。
- http:// : 要使用什么协议来连接这个主机名。
#### 3.2 常见的域名解析服务器
- 114dns
114.114.114.114
114.114.115.115
这是国内用户量数一数二的 dns 服务器,该 dns 一直标榜高速、稳定、无劫持、防钓鱼。
- Google DNS
8.8.8.8
8.8.4.4
......
可以理解为由这些服务器帮我们记录的域名和IP的对应关系我们访问域名的时候去找这些dns服务器询问该域名对应的IP地址当然除了上述提到的这些dns服务器三大运营商也提供了dns解析服务
#### 3.3 域名解析的过程
1. 浏览器发起域名解析首先查询浏览器缓存如果没有就查询hosts文件如果没有就提出域名解析请求
2. 客户机提出域名解析请求,并将该请求发送给本地的域名服务器。
3. 当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。
4. 如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。
5. 本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。
6. 重复第四步,直到找到正确的纪录。
7. 本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机
### 4. 配置网络服务
#### 4.1 图形化配置网络
使用nmtui命令来配置网络
```bash
[root@localhost ~]# nmtui
# 可以将环境变量改成中文
[root@localhost ~]# yum install -y langpacks-zh_CN # 安装中文包支持
[root@localhost ~]# export LANG=zh_CN.UTF-8
# 改回英文是LANG=en_US.UTF-8
```
![image-20241122171056057](08.Linux网络管理/image-20241122171056057.png)
![image-20241122171126506](08.Linux网络管理/image-20241122171126506.png)
![image-20241122171159047](08.Linux网络管理/image-20241122171159047.png)
![image-20241122171305718](08.Linux网络管理/image-20241122171305718.png)
![image-20241122171325905](08.Linux网络管理/image-20241122171325905.png)
##### 4.1.1 重新加载网络配置
```sh
[root@localhost ~]# systemctl restart NetworkManager
# 或者先禁用再启用网卡
[root@localhost ~]# yum install -y NetworkManager-initscripts-updown-1:1.48.10-2.el9_5.noarch
[root@localhost ~]# ifdown ens160 # 禁用网卡
[root@localhost ~]# ifup ens160 # 启用网卡
```
#### 4.2 命令行配置网络
```bash
# 修改网卡配置文件
[root@localhost ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection
[connection]
id=ens160
uuid=dfea55d8-6ddc-3229-8152-cb9e261de181
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1732264040
[ethernet]
[ipv4]
address1=192.168.88.110/24,192.168.88.2
dns=114.114.114.114;114.114.115.115;
method=manual
[ipv6]
addr-gen-mode=eui64
method=auto
[proxy]
```
当修改完Linux系统中的服务配置文件后并不会对服务程序立即产生效果。要想让服务程序获取到最新的配置文件需要手动重启相应的服务之后就可以看到网络畅通了
```bash
[root@localhost ~]# systemctl restart NetworkManager
[root@localhost ~]# ping -c 4 www.baidu.com
PING www.a.shifen.com (180.101.50.242) 56(84) bytes of data.
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=1 ttl=128 time=11.3 ms
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=2 ttl=128 time=8.70 ms
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=3 ttl=128 time=13.5 ms
64 bytes from 180.101.50.242 (180.101.50.242): icmp_seq=4 ttl=128 time=9.95 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 8.703/10.882/13.535/1.793 ms
```
##### 4.2.1 网卡配置文件参数
| **节** | **参数** | **描述** |
| -------------- | ---------------------- | ------------------------------------------------------------ |
| `[connection]` | `id` | 连接的名称,这里是 `ens160`。 |
| | `uuid` | 连接的唯一标识符UUID用于唯一识别此连接。 |
| | `type` | 连接的类型,`ethernet` 表示这是一个以太网连接。 |
| | `autoconnect-priority` | 自动连接优先级,数值越小优先级越低。这里设置为 `-999`,表示极低的优先级。 |
| | `interface-name` | 连接对应的网络接口名称,这里是 `ens160`。 |
| | `timestamp` | 连接的时间戳,表示最后修改的时间。 |
| `[ethernet]` | - | 此节用于配置以太网特定的设置,当前没有额外参数。 |
| `[ipv4]` | `address1` | 静态 IPv4 地址及其子网掩码,格式为 `IP地址/子网掩码` 和网关,例:`192.168.88.110/24,192.168.88.2`。 |
| | `dns` | DNS 服务器地址,多个地址用分号分隔,这里是 `114.114.114.114;114.114.115.115;`。 |
| | `method` | IPv4 地址配置方法,这里设置为 `manual`,表示使用手动配置。 |
| `[ipv6]` | `addr-gen-mode` | 地址生成模式,`eui64` 表示使用 EUI-64 地址生成方式。 |
| | `method` | IPv6 地址配置方法,这里设置为 `auto`,表示自动获取 IPv6 地址。 |
| `[proxy]` | - | 此节用于配置代理设置,当前没有额外参数。 |
#### 4.3 nmcli 工具详解
nmcli命令是redhat7或者centos7之后的命令该命令可以完成网卡上所有的配置工作并且可以写入 配置文件,永久生效
- 查看接口状态
```bash
[root@localhost ~]# nmcli device status
DEVICE TYPE STATE CONNECTION
ens160 ethernet connected ens160
lo loopback connected (externally) lo
```
- 查看链接信息
```bash
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens160 dfea55d8-6ddc-3229-8152-cb9e261de181 ethernet ens160
lo 529b2eed-2755-4cce-af3c-999beb49882d loopback lo
```
- 配置IP等网络信息
```bash
[root@localhost ~]# nmcli con mod "ens160" ipv4.addresses 192.168.88.140/24 ipv4.gateway 192.168.88.2 ipv4.dns "8.8.8.8,8.8.4.4" ipv4.method manual
```
- 启动/停止接口
```bash
[root@localhost ~]# nmcli connection down ens160
[root@localhost ~]# nmcli connection up ens160
```
- 创建链接
```bash
[root@localhost ~]# nmcli connection add type ethernet ifname ens160 con-name dhcp_ens160
# 激活链接
[root@localhost ~]# nmcli connection up dhcp_ens160
```
- 删除链接
```bash
[root@localhost ~]# nmcli connection delete dhcp_ens160
成功删除连接 'dhcp_ens160'37adadf4-419d-47f0-a0f6-af849160a4f7
```
### 5. ifconfig
- ifconfig 命令用于显示或设置网络设备。
**安装:**`yum install -y net-tools`
#### 5.1 语法
```bash
ifconfig [network_interface]
[down|up]
[add <address>]
[del <address>]
[hw <type> <hw_address>]
[io_addr <I/O_address>]
[irq <IRQ>]
[media <media_type>]
[mem_start <memory_address>]
[metric <number>]
[mtu <bytes>]
[netmask <netmask>]
[tunnel <address>]
[-broadcast <address>]
[-pointopoint <address>]
[<IP_address>]
```
#### 5.2 选项说明
- `down`/`up`: 禁用/启用网络接口
- `add <address>`/`del <address>`: 添加或删除 IP 地址
- `hw <type> <hw_address>`: 设置硬件地址 (MAC 地址)
- `io_addr <I/O_address>`: 设置 I/O 地址
- `irq <IRQ>`: 设置中断请求
- `media <media_type>`: 设置网络媒体类型
- `mem_start <memory_address>`: 设置内存起始地址
- `metric <number>`: 设置路由度量值
- `mtu <bytes>`: 设置 MTU 值
- `netmask <netmask>`: 设置子网掩码
- `tunnel <address>`: 设置隧道地址
- `-broadcast <address>`: 设置广播地址
- `-pointopoint <address>`: 设置点对点地址
- `<IP_address>`: 设置 IP 地址
#### 5.3 实例
- 显示网络设备信息
```bash
[root@localhost cmatrix-1.2a]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.136 netmask 255.255.255.0 broadcast 192.168.88.255
inet6 fe80::a49c:12c9:1ebd:8fb2 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:cb:d5:1a txqueuelen 1000 (Ethernet)
RX packets 122441 bytes 178564616 (170.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13762 bytes 1315614 (1.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
```
- 启动关闭指定网卡
```bash
[root@localhost ~]# ifconfig ens33 down
[root@localhost ~]# ifconfig ens33 up
```
- 配置IP地址
```bash
[root@localhost ~]# ifconfig eth0 192.168.1.56
//给eth0网卡配置IP地址
[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0
// 给eth0网卡配置IP地址,并加上子掩码
[root@localhost ~]# ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255
// 给eth0网卡配置IP地址,加上子掩码,加上个广播地址
```
- 设置最大传输单元
```bash
[root@localhost ~]# ifconfig eth0 mtu 1500
//设置能通过的最大数据包大小为 1500 bytes
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,284 @@
# 10.ssh远程管理
## 10.ssh远程管理
### 1. SSH协议/OpenSSH服务
SSHSecure Shell协议是一种网络协议用于加密方式远程登录到服务器。它提供了一种安全的方法来传输数据防止数据在传输过程中被窃听或篡改。SSH协议不仅用于远程登录还可用于远程执行命令、文件传输SFTP、端口转发等。
OpenSSH是SSH协议的一个开源实现工具由OpenBSD项目开发和维护。它是大多数Unix和类Unix操作系统中默认的SSH实现包括Linux、macOS和FreeBSD等。
OpenSSH提供了服务端程序(openssh-server)和客户端工具(openssh-client)
* Mac和Linux中默认已安装ssh客户端可直接在终端中使用ssh命令
* Windows需手动安装ssh客户端较常用的Windows SSH客户端有PuTTY和XShell
**SSH能够提供两种安全验证的方法**
* 基于**口令**的验证—用账户和密码来验证登录
* 基于**密钥**的验证—需要在本地生成密钥对,然后把密钥对中的公钥上传至服务器,并与服务器中的公钥进行比较;该方式相较来说更安全
### 2. SSH客户端使用
OpenSSH服务提供我们SSH工具该工具采用SSH协议来连接到远程主机上。
#### 2.1 SSH常用操作
1. 通过SSH协议登录远程主机
```bash
[root@localhost ~]# ssh root@192.168.88.20 # root@表示登录到root用户
root@192.168.88.20's password: # 输入远程主机的密码
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Tue Dec 24 15:42:36 2024 from 192.168.88.1
```
2. 指定连接远程主机的端口号(SSH默认连接的端口号为22如果修改过端口号可以通过以下方式连接)
```bash
[root@localhost ~]# ssh root@192.168.88.20 -P22
root@192.168.88.20's password:
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Tue Dec 24 15:43:18 2024 from 192.168.88.10
```
3. 不登陆到远程主机中,仅仅执行某个命令并返回结果
```bash
[root@localhost ~]# ssh root@192.168.88.20 ls -lah /etc
root@192.168.88.20's password:
total 1.2M
drwxr-xr-x. 95 root root 8.0K Dec 24 15:41 .
dr-xr-xr-x. 18 root root 235 Nov 9 10:51 ..
-rw-------. 1 root root 0 Nov 9 10:51 .pwd.lock
-rw-r--r--. 1 root root 208 Nov 9 10:51 .updated
-rw-r--r--. 1 root root 4.6K Apr 21 2024 DIR_COLORS
-rw-r--r--. 1 root root 4.7K Apr 21 2024 DIR_COLORS.lightbgcolor
-rw-r--r--. 1 root root 94 May 16 2022 GREP_COLORS
drwxr-xr-x. 7 root root 134 Nov 9 10:52 NetworkManager
drwxr-xr-x. 2 root root 48 Nov 9 10:52 PackageKit
drwxr-xr-x. 6 root root 70 Nov 9 10:56 X11
......
```
4. 查看已经连接过主机的记录(会看到ssh客户端产生的公钥信息)
```bash
[root@localhost ~]# cat .ssh/known_hosts
192.168.88.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOThT7fdh7wxANOIlTBGdcF+m2sVH/N56HKSJGANz19u
192.168.88.20 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCmVQz5ziwIu9Ue3tUT2BGSr81+t7E3dpJBGuydoBnVeD6S7PVVkyf8RxsbYd1D0PhxlIb5qJzxybla8ua47J1RqKEZjNA0CITV4oFCcdTt38hqZzE1JxNqcV3TyqPt0uFetB09bYckk2T/HascnKAm2G7Sl+BIbs27oeFPhkSph/wfOLxh9nn6Yk3NwqPXrpUmn7w4A8P8UdeSXD4YvK/TNjPz9/eI0a2joxNpzyS0glcBhWfEb2UiplDGJlKoVl0NPxYhhYcwDLtzNhfgmre2wcgA9v3phdTUvsH1QWExE4qhpIisNa7jUhrB8Gg6ki3sI143MJnvdD56BILbv2U7UPOjIR5bTRx2yuDp2Z3d5lK+8gowyXAjmp59gVfUO8vaLVZ5oBiuzPBBntWqBrfYfWmd2CqoYFHXjCf+6quPNx2hVASIfHvUWXQuYzo8NOgaR0niMzzanADam3B87Tqlvo9psUQ1TQ1zdJlvo8FL+TkYyn6+Bc5lGJ3/un4Ip6s=
192.168.88.20 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGHvrjmizdqObHoyK1gJ59yIDGBfTNbLec0KzXZyAWrPwCdeQkaNRfmS9nb8W2jJCbZvciH1z3OPU8tMD5CdN3c=
```
#### 2.2 SCP远程文件传输
除了连接到远程主机之外,我们也可以用附带的小工具**SCP**来进行远程文件传输和下载
1. 将本地文件复制给远程主机,-r递归复制整个目录-p保留源文件的时间和权限属性
```bash
[root@localhost ~]# touch file
[root@localhost ~]# echo "I am server1" > file
[root@localhost ~]# scp -P22 -r -p /root/file root@192.168.88.20:/tmp
root@192.168.88.20's password:
file 100% 13 12.2KB/s 00:00
```
2. 将远程主机上的文件下载到本地
```bash
[root@localhost ~]# scp -P22 -r -p root@192.168.88.20:/tmp/file /root/
```
3. SSH客户端自带SFTP功能可以直接通过FTP协议进行文件传递
```bash
[root@localhost ~]# sftp -oPort=22 root@192.168.88.20
root@192.168.88.20's password:
Connected to 192.168.88.20.
sftp> ls
anaconda-ks.cfg
sftp> get /tmp/file
Fetching /tmp/file to file
file 100% 13 6.8KB/s 00:00
sftp> exit
[root@localhost ~]# ls
anaconda-ks.cfg file
[root@localhost ~]# cat file
I am server1
```
### 3. SSH配置文件
* sshd服务的配置信息保存在`/etc/ssh/sshd_config`文件中。运维人员一般会把保存着最主要配置信息的文件称为主配置文件,而配置文件中有许多以井号开头的注释行,要想让这些配置参数生效,需要在修改参数后再去掉前面的井号
* sshd服务配置文件中包含的参数以及作用
| 参数 | 作用 |
| :-------------------------------- | :---------------------------------- |
| Port 22 | 默认的sshd服务端口 |
| ListenAddress 0.0.0.0 | 设定sshd服务器监听的IP地址 |
| Protocol 2 | SSH协议的版本号 |
| HostKey /etc/ssh/ssh_host_key | SSH协议版本为1时DES私钥存放的位置 |
| HostKey /etc/ssh/ssh_host_rsa_key | SSH协议版本为2时RSA私钥存放的位置 |
| HostKey /etc/ssh/ssh_host_dsa_key | SSH协议版本为2时DSA私钥存放的位置 |
| PermitRootLogin yes | 设定是否允许root管理员直接登录 |
| StrictModes yes | 当远程用户的私钥改变时直接拒绝连接 |
| MaxAuthTries 6 | 最大密码尝试次数 |
| MaxSessions 10 | 最大终端数 |
| PasswordAuthentication yes | 是否允许密码验证 |
| PubkeyAuthentication yes | 是否允许使用公钥进行身份验证 |
### 4. 安全密钥验证
上面讲到ssh远程连接除了使用密码的方式登录还可以使用密钥对(公钥和私钥)进行登录。相比于密码等于而言,密钥登录会更加的安全
如果使用公钥和私钥进行加密那么我们称之为是一种非堆成加密的方式进行加密那同样的还有对称加密不过对称加密我们到后面HTTPS协议中再详细讲解。
非对称加密是一种加密方式,它涉及到两个密钥:一个公钥和一个私钥。公钥可以公开给任何人,而私钥则必须保密,只有密钥的拥有者才知道。这种加密方式的特点是使用公钥加密的数据只能通过对应的私钥来解密,反之亦然,使用私钥加密的数据只能通过对应的公钥来解密。
#### 4.1 非对称加密
1. **密钥生成**:首先生成一对密钥,一个公钥和一个私钥。这两个密钥是数学上相关的,但即使知道其中一个,也很难计算出另一个。
2. **加密**:发送方使用接收方的公钥来加密信息。这个过程是可逆的,但只有拥有正确私钥的人才能解密。
3. **解密**:接收方使用自己的私钥来解密信息。这个过程确保了只有拥有私钥的接收方才能阅读信息。
我们可以想象一下,你有一个非常特别的邮箱,这个邮箱有一个特点:它有两个锁。一个锁是公开的,任何人都可以往里投信,但只有你知道如何打开它(私钥)。另一个锁是私有的,只有你知道它在哪里,而且只有你拥有打开它的钥匙(公钥)。
- **公钥(锁)**:你把这个特别的锁(公钥)放在一个公共的地方,比如你的家门口。任何人都可以给你写信,他们只需要用这个锁把你的信锁起来,然后投进你的邮箱。因为只有你知道如何打开这个锁,所以你的信件在运输过程中是安全的。
- **私钥(钥匙)**:你把打开这个锁的钥匙(私钥)藏在家里一个安全的地方。当信件到达时,你可以用你的私钥打开锁,取出信件阅读。
- **安全性**:即使有人试图复制这个锁(公钥),他们也无法制造出能打开它的钥匙(私钥),因为这两个是数学上相关的,但计算其中一个从另一个是几乎不可能的。
#### 4.2 SSH密钥对口令验证
1. 在客户端主机中生成`密钥对`
```shell
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # 选择密钥存放的位置,默认是/root/.ssh/目录
Enter passphrase (empty for no passphrase): # 是否给密钥设置密码
Enter same passphrase again: # 重复密码
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:+LY6jvJ6Azxw9avB5eMKOMBrzvryMVG1nHjszJI22lk root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
| . |
| .= o |
| .o.* |
|o .. *o. |
|.=..=oE.S |
|..==o=+. |
|oo=oo+ .o |
|=..++.o. . |
|o*+=++oo. |
+----[SHA256]-----+
# 查看/root/.ssh目录中是否存在id_rsa(私钥)和id_rsa.pub(公钥)
[root@localhost ~]# ls -al /root/.ssh/
total 16
drwx------. 2 root root 80 Dec 25 09:24 .
dr-xr-x---. 3 root root 159 Dec 24 15:58 ..
-rw-------. 1 root root 2610 Dec 25 09:24 id_rsa
-rw-r--r--. 1 root root 580 Dec 25 09:24 id_rsa.pub
-rw-------. 1 root root 837 Dec 24 15:43 known_hosts
-rw-r--r--. 1 root root 95 Dec 24 15:43 known_hosts.old
```
2. 把客户端主机中生成的公钥文件传送至远程主机
```shell
# 使用ssh-copy-id这个工具可以自动的将公钥发送给目标主机的/root/.ssh/目录下面
[root@localhost ~]# ssh-copy-id 192.168.88.20
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.88.20's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.88.20'"
and check to make sure that only the key(s) you wanted were added.
# 检查server2中是否成功接收到公钥
# server2中查看
[root@localhost ~]# ls -al /root/.ssh/
total 12
drwx------. 2 root root 71 Dec 25 09:29 .
dr-xr-x---. 3 root root 163 Nov 24 11:04 ..
-rw-------. 1 root root 580 Dec 25 09:29 authorized_keys
-rw-------. 1 root root 837 Dec 24 15:54 known_hosts
-rw-r--r--. 1 root root 95 Dec 24 15:54 known_hosts.old
# 公钥发送过来以后名称会默认的改变为authorized_keys。我们可以查看这个文件中的内容就是我们的公钥与id_rsa.pub一致
[root@localhost ~]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDpPlj0cTuje/LHClQ+InIzTSdC2AViBWD3hb77ZcFpC1rfem7A9fuOJEZlNNALeHyAVjVvlVujhWDO8e7mbSJ0k/ECUVvq82r5bf9g8nJKuyWmKQ8DWHXhe4+WnMKHRDPsDM7blr/tnaUb86FPql0MUW1VOEQkP3ZN+NDomfH2DAuMzX5EKhYkcvVuekELeevXlEwWHA/mmizkxBqFKuoBdSpiQ7xjVC+FxAjAnrQwD1jmdrf+25x8DYm9J2S+led6fy3s6QPYRlawAR91M2Xf8+W1RHndcnZGhReCtZBJsIs6OCC3NqxCeZIVgwZzeAtPClWDyh1YhuvEL5mM1hjHICWhHCLqo15R7A0e/zCqhf3wxfelnQ21aNAbzALDYAjkquxm7nLbmRq07Na0XdASfJHpiuDG/aYzNTWaiQzcgZQmz13FUNfI+dikRupwL3XW57eNfo3qHNhZn9TxIQOueJ6N7vbSoYdiN34xvc8g1ZRPRFONftMg1HYBcZAYgMk= root@localhost.localdomain
```
3. 对远程主机(server2)进行设置使其只允许密钥验证拒绝传统的口令验证方式。记得在修改配置文件后保存并重启sshd服务程序
```shell
[root@localhost ~]# vim /etc/ssh/sshd_config
..................
65 PasswordAuthentication no
PubkeyAuthentication yes
...................
[root@localhost ~]# systemctl restart sshd
```
4. 在客户端尝试登录到服务器,此时无须输入密码也可成功登录
```shell
[root@localhost ~]# ssh root@192.168.88.20
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Dec 25 09:11:48 2024 from 192.168.88.1
# 并且检查server2中的secure日志中也可以看到我们是通过公钥登录到server2中
[root@localhost ~]# cat /var/log/secure |grep publickey
Dec 25 09:40:27 localhost sshd[2392]: Accepted publickey for root from 192.168.88.10 port 40652 ssh2: RSA SHA256:+LY6jvJ6Azxw9avB5eMKOMBrzvryMVG1nHjszJI22lk
```
### 5. mobaxterm生成密钥登录
通过mobaxterm我们也可以生成密钥对从而通过密钥对进行登录
1. 在工具选项中找到ssh密钥生成器
![image-20241225095837131](10.ssh远程管理/image-20241225095837131-17364951629947.png)
2. 选择生成的密钥对类型以及点击Generator生成
![image-20241225100003857](10.ssh远程管理/image-20241225100003857-17364951629948.png)
3. 生成密钥对并且保存公钥和私钥
生成的时候,要鼠标不断移动,该工具会根据鼠标移动的坐标,来生成随机的密钥
![image-20241225100209895](10.ssh远程管理/image-20241225100209895-17364951629949.png)
三、linux .ssh目录下新建文件`authorized_keys`,将上面生成的密钥粘进去
![image-20241225104817789](10.ssh远程管理/image-20241225104817789-17364951629926.png)
四、但是大概率会连接失败原因是由于我们通过mobaxterm生成的密钥文件权限不满足要求并且在windows上修改权限的话非常麻烦。所以我们可以考虑通过在cmd命令行中使用ssh-keygen工具来生成密钥文件
![image-20250114105202083](10.ssh远程管理/image-20250114105202083.png)
可以看到生成的公钥和私钥
![image-20250114105137753](10.ssh远程管理/image-20250114105137753.png)
打开公钥文件复制其中的内容在Linux中的/root.ssh/authorized_keys文件中粘贴
然后继续通过cmd连接测试
![image-20250114105438117](10.ssh远程管理/image-20250114105438117.png)
也可以尝试使用Mobaxterm工具选择私钥进行连接。但是Mobaxterm连接的时候也可能会遇到报错的问题。这个是受不同工具的影响。如果通过cmd能够连接成功的话。就说明我们的密钥和配置是正常的。

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Some files were not shown because too many files have changed in this diff Show More