Linux基础复习第七天
1./dev/zero和/dev/null 是什么
在 Linux 中,/dev/zero
和 /dev/null
是两个特殊的伪设备文件(也称为虚拟设备),它们的行为和用途截然不同,但在系统管理、脚本开发和数据操作中非常有用。
-
/dev/zero
它的作用是,提供无限的空字符(NULL 字节,ASCII 值为 0),
当从
/dev/zero
读取时,它会持续输出0
字节(二进制的 0),直到你主动停止读取。写入/dev/zero
的数据会被丢弃(与/dev/null
类似)。-
典型用途:
-
创建特定大小的空文件:
# 使用 dd 命令将 /dev/zero 的内容写入文件,生成一个填充 0 的文件。 # 示例: # 这会生成一个 10MB 的文件 zero_file.txt,其内容全部为 0。 dd if=/dev/zero of=zero_file.txt bs=1M count=10
-
初始化内存或设备:
在某些场景下(如测试磁盘性能),可以使用
/dev/zero
填充磁盘或内存。 -
生成随机数据(与
/dev/urandom
结合):虽然
/dev/zero
本身不提供随机性,但可以与其他工具结合使用。
-
-
-
/dev/null
它的作用是,丢弃一切写入其中的数据。从
/dev/null
读取时,会立即返回 EOF(文件结束符),没有任何数据。-
典型用途:
-
丢弃不需要的输出:
将命令的标准输出(stdout)或标准错误(stderr)重定向到
/dev/null
,以隐藏输出。示例:
command > /dev/null # 丢弃标准输出 command 2> /dev/null # 丢弃标准错误 command > /dev/null 2>&1 # 同时丢弃标准输出和标准错误
-
清空文件内容:
将
/dev/null
的内容重定向到文件,可以清空文件内容。示例:
cat /dev/null > filename.txt # 清空文件内容
-
屏蔽脚本中的调试信息
在脚本中,如果某些命令的输出不需要显示,可以通过重定向到
/dev/null
隐藏。
-
特性 /dev/zero
/dev/null
读取行为 返回无限的 0 字节 立即返回 EOF 写入行为 数据被丢弃 数据被丢弃 主要用途 创建填充 0 的文件 丢弃不需要的输出 典型命令 dd if=/dev/zero of=...
> /dev/null
或2> /dev/null
比喻 无限的 0 字节工厂 黑洞(吞噬所有写入的数据) -
-
实际场景示例:
-
屏蔽命令错误提示:
find / -name "nonexistent_file" 2> /dev/null
这会隐藏
find
命令的错误输出(例如文件不存在的提示)。 -
创建测试文件:
dd if=/dev/zero of=test.bin bs=512 count=100
生成一个 51,200 字节(50KB)的二进制文件
test.bin
,内容全为 0。 -
清空日志文件:
cat /dev/null > /var/log/some.log
清空日志文件内容,但保留文件本身。
-
2.如何查看硬盘的分区,以及当前系统磁盘使用大小
-
查看硬盘的分区情况
-
fdisk
命令功能:查看磁盘分区表(支持 MBR 分区表)。
sudo fdisk -l # 输出示例: Disk /dev/loop0: 63.95 MiB, 67051520 bytes, 130960 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop1: 63.77 MiB, 66863104 bytes, 130592 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop2: 87.04 MiB, 91267072 bytes, 178256 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/loop3: 89.4 MiB, 93745152 bytes, 183096 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes ............
-
lsblk
命令功能:以树状结构列出所有块设备(包括磁盘和分区)。
lsblk #输出示例: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS loop0 7:0 0 63.9M 1 loop /snap/core20/2318 loop1 7:1 0 63.8M 1 loop /snap/core20/2599 loop2 7:2 0 87M 1 loop /snap/lxd/29351 loop3 7:3 0 89.4M 1 loop /snap/lxd/31333 loop4 7:4 0 50.9M 1 loop /snap/snapd/24718 loop5 7:5 0 49.3M 1 loop /snap/snapd/24792 sda 8:0 0 40G 0 disk ├─sda1 8:1 0 1M 0 part └─sda2 8:2 0 40G 0 part / sr0 11:0 1 2G 0 rom
-
parted
命令功能:查看磁盘分区表(支持 GPT 和 MBR)。
sudo parted -l # 输出示例: Model: VMware, VMware Virtual S (scsi) Disk /dev/sda: 42.9GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB bios_grub 2 2097kB 42.9GB 42.9GB ext4
-
blkid
命令功能:查看磁盘分区的 UUID 和文件系统类型。
sudo blkid #输出示例: /dev/sr0: BLOCK_SIZE="2048" UUID="2024-09-11-18-46-48-00" LABEL="Ubuntu-Server 22.04.5 LTS amd64" TYPE="iso9660" PTTYPE="PMBR" /dev/sda2: UUID="165ca13d-1be0-434c-9458-fb7a4d1fceef" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4fa41d64-11ce-4ec3-8372-570d76fd1ebe" /dev/loop1: TYPE="squashfs" /dev/loop4: TYPE="squashfs" /dev/loop2: TYPE="squashfs" /dev/loop0: TYPE="squashfs" /dev/sda1: PARTUUID="a038401d-55cc-40fb-88e1-268c92963e74" /dev/loop5: TYPE="squashfs" /dev/loop3: TYPE="squashfs"
-
-
查看磁盘使用大小
-
df
命令功能:查看文件系统的磁盘空间使用情况。
常用选项:
-h
:以人类可读的格式(如 GB、MB)显示。-T
:显示文件系统类型。-i
:查看 inode 使用情况。
df -hT # 输出示例: Filesystem Type Size Used Avail Use% Mounted on tmpfs tmpfs 388M 1.6M 387M 1% /run /dev/sda2 ext4 40G 8.1G 30G 22% / tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs tmpfs 388M 4.0K 388M 1% /run/user/1000
-
du
命令功能:查看目录或文件的磁盘使用情况。
常用选项:
-s
:汇总目录总大小。-h
:以人类可读的格式显示。--max-depth=N
:限制递归深度。
# 查看当前目录的总大小 du -sh . # 查看 `/home/user` 目录的大小 du -sh /home/user # 查看当前目录下所有子目录的大小(深度为 1) du -h --max-depth=1 .
-
smartctl
命令(查看磁盘健康状态)功能:查看硬盘的 SMART 信息(需要安装
smartmontools
)。sudo smartctl -a /dev/sda # 输出示例: smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.15.0-143-generic] (local build) Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Vendor: VMware, Product: VMware Virtual S Revision: 1.0 User Capacity: 42,949,672,960 bytes [42.9 GB] Logical block size: 512 bytes Rotation Rate: Solid State Device Device type: disk Local Time is: Mon Jul 14 09:48:52 2025 UTC SMART support is: Unavailable - device lacks SMART capability. === START OF READ SMART DATA SECTION === Current Drive Temperature: 0 C Drive Trip Temperature: 0 C Error Counter logging not supported Device does not support Self Test logging
-
3.创建一块新硬盘,1G大小,挂载到/opt/mydir目录,并设置为开机启动挂载
设置硬盘大小为1GB
最后,保存确认启动虚拟机
-
在Ubuntu 中配置新硬盘
-
步骤1:查看新硬盘
sudo fdisk -l 新硬盘通常为 /dev/sdb(原有硬盘为 /dev/sda)。 如果未显示 /dev/sdb,请重启虚拟机后再次运行命令。
-
步骤 2:分区新硬盘
# 使用 fdisk 创建分区: sudo fdisk /dev/sdb
-
按以下步骤操作:
- 输入
n
→ 选择p
(主分区)→ 分区号选择1
→ 起始扇区默认(回车)→ 输入+1G
设置大小为 1GB,或者+1020M的范围内确保数值不超出。 - 输入
w
保存分区表并退出。
# 更新内核分区表: sudo partprobe /dev/sdb
- 输入
-
-
步骤3:格式化分区
# 将分区格式化为 ext4 文件系统: sudo mkfs.ext4 /dev/sdb1
-
步骤4:创建挂载点
# 创建目标目录: sudo mkdir -p /opt/mydir # 设置目录权限(可选): sudo chmod 755 /opt/mydir
-
步骤5:临时挂载分区
# 挂载分区到目标目录: sudo mount /dev/sdb1 /opt/mydir # 验证挂载: df -h # 输出为: Filesystem Size Used Avail Use% Mounted on tmpfs 388M 1.6M 387M 1% /run /dev/sda2 40G 7.1G 31G 19% / tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 388M 4.0K 388M 1% /run/user/1000 /dev/sdb1 965M 24K 899M 1% /opt/mydir
输出包含 /dev/sdb1 挂载到 /opt/mydir,且大小约为 1GB。
-
-
设置开机自动挂载
-
步骤1:获取分区的UUID:
# 查看分区的 UUID: sudo blkid /dev/sdb1 # 输出为 /dev/sdb1: UUID="8ab84e60-c97a-4e2e-8984-abe387b6936d" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="f5a385b9-01"
-
步骤2:编辑
/etc/fstab
文件# 打开 /etc/fstab: sudo vim /etc/fstab # 添加以下内容(UUID=后面需要替换为实际值): UUID=8ab84e60-c97a-4e2e-8984-abe387b6936d /opt/mydir ext4 defaults 0 2
-
保存然后退出
-
步骤 3:测试
fstab
配置# 手动挂载所有配置: sudo mount -a
如果无报错,说明配置正确。
-
验证开机自动挂载
# 重启系统: sudo reboot # 检查挂载状态: df -h
确认
/opt/mydir
已自动挂载。
4.使用dd命令,在/opt/mydir目录中写入一个200M大小的文件
sudo dd if=/dev/zero of=/opt/mydir/200MB_file bs=1M count=200
参数说明:
if=/dev/zero:从 /dev/zero 读取数据(生成全零内容)。
of=/opt/mydir/200MB_file:将文件写入到 /opt/mydir/200MB_file。
bs=1M:设置块大小为 1MB。
count=200:复制 200 个块,总大小为 200MB。
-
验证文件大小
ls -lh /opt/mydir/200MB_file #输出示例: -rw-r--r-- 1 root root 200M Jul 14 22:12 /opt/mydir/200MB_file
-
dd
命令的常用选项选项 作用 if=FILE
指定输入文件(默认为 /dev/null
)。of=FILE
指定输出文件(默认为 /dev/null
)。bs=BYTES
设置块大小(读写单位),默认为 512 字节。 count=N
指定复制的块数。 skip=N
跳过输入文件的前 N 个块。 seek=N
在输出文件中跳过前 N 个块(常用于填充空洞)。 conv=CONV
数据转换选项(如 notrunc
、sync
、noerror
等)。status=LEVEL
控制状态输出(如 progress
显示进度)。 -
dd
命令的常见使用场景 -
磁盘克隆
-
将
/dev/sda
克隆到/dev/sdb
:dd if=/dev/sda of=/dev/sdb bs=4M conv=sync,noerror status=progress
-
-
数据擦除
-
安全清除硬盘数据:
dd if=/dev/zero of=/dev/sda bs=4M status=progress
注意:此操作会永久删除
/dev/sda
上的所有数据!
-
-
文件转换
-
将文件转换为大写:
dd if=input.txt of=output.txt conv=ucase
-
交换字节顺序:
dd if=data.bin of=data_swapped.bin conv=swab
-
5.如何查看当前系统内存使用大小
-
方法 1:使用
free
命令free -h
输出示例:
total used free shared buff/cache available Mem: 3.8Gi 309Mi 3.0Gi 1.0Mi 539Mi 3.3Gi Swap: 3.8Gi 0B 3.8Gi
- 关键指标:
total
: 总内存大小。used
: 已使用内存(包括缓存和缓冲区)。free
: 完全未使用的内存。available
: 可用内存(更准确的可用内存估算)。
- 关键指标:
-
方法 2:使用
top
或htop
命令-
运行
top
:top # 输出示例: top - 17:20:49 up 3:14, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 223 total, 1 running, 222 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 3875.9 total, 3026.7 free, 309.3 used, 539.9 buff/cache MiB Swap: 3875.0 total, 3875.0 free, 0.0 used. 3330.7 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 740 root 20 0 167316 8524 7212 S 0.3 0.2 0:14.24 vmtoolsd 1414 longlij+ 20 0 10624 4072 3232 R 0.3 0.1 0:00.02 top 1 root 20 0 100732 11504 8184 S 0.0 0.3 0:02.29 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp 5 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 slub_flushwq 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
-
查看内存使用:
- 在
Mem
行中查看 内存总量、已使用、空闲。 - 在
Swap
行中查看 交换分区使用情况。
- 在
-
使用
htop
(需安装):htop
- 提供更直观的内存和进程监控界面。
-
-
方法 3:查看
/proc/meminfo
cat /proc/meminfo # 输出示例: MemTotal: 3968924 kB MemFree: 3098660 kB MemAvailable: 3410956 kB Buffers: 20240 kB Cached: 479988 kB SwapCached: 0 kB Active: 97096 kB Inactive: 460684 kB Active(anon): 1512 kB Inactive(anon): 66712 kB Active(file): 95584 kB ...........
- 关键字段:
MemTotal
: 总内存大小(单位 KB)。MemFree
: 未使用内存。Buffers
/Cached
: 缓存和缓冲区占用的内存。
- 关键字段:
-
方法 4:使用
vmstat
命令vmstat -s # 输出示例: 3968924 K total memory 316100 K used memory 97096 K active memory 460788 K inactive memory 3098660 K free memory 20240 K buffer memory 533924 K swap cache 3967996 K total swap 0 K used swap 3967996 K free swap 736 non-nice user cpu ticks 0 nice user cpu ticks 2348 system cpu ticks 4740213 idle cpu ticks 230 IO-wait cpu ticks 0 IRQ cpu ticks 102 softirq cpu ticks 0 stolen cpu ticks 281457 pages paged in 222528 pages paged out 0 pages swapped in 0 pages swapped out 1069732 interrupts 1556534 CPU context switches 1752501991 boot time 1545 forks
- 显示内存、进程、分页等详细统计信息。
6.如何查看系统负载,系统负载为10,表示什么含义,是高还是低。
-
在 Linux 系统中,可以通过以下命令查看系统负载:
-
uptime
命令uptime # 输出示例: 10:19:56 up 5 days, 3 users, load average: 10.00, 8.50, 7.20
含义:
load average: 10.00, 8.50, 7.20 分别表示过去 1分钟、5分钟、15分钟 的平均负载。 -
top
或htop
命令top #输出示例: top - 02:26:43 up 2 min, 1 user, load average: 0.29, 0.24, 0.10 Tasks: 262 total, 1 running, 261 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 3875.9 total, 3223.1 free, 311.7 used, 341.1 buff/cache MiB Swap: 3875.0 total, 3875.0 free, 0.0 used. 3330.7 avail Mem
htop # 第一行也能看到相关的系统负载信息
-
w
命令w # 输出示例: 02:28:29 up 4 min, 1 user, load average: 0.24, 0.22, 0.10 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT longliji pts/0 192.168.163.1 02:24 0.00s 0.03s 0.00s w
-
直接查看
/proc/loadavg
文件cat /proc/loadavg # 输出示例: 10.00 8.50 7.20 1/200 12345
含义:前三个数字分别对应 1 分钟、5 分钟、15 分钟的平均负载。
-
-
系统负载为 10 的含义
-
负载的定义
- 系统负载(Load)是指当前处于可运行状态(R)和不可中断状态(D)的进程数总和:
- 可运行状态(R):正在运行或等待 CPU 的进程。
- 不可中断状态(D):进程因等待 I/O(如磁盘、网络)而无法被中断,通常与 I/O 瓶颈相关。
- 系统负载(Load)是指当前处于可运行状态(R)和不可中断状态(D)的进程数总和:
-
负载值的参考标准
- 负载值与 CPU 核心数的关系:
- 如果系统有 N 个 CPU 核心,负载值 ≤ N 表示系统负载正常。
- 如果负载值 > N,表示系统资源(CPU 或 I/O)可能不足,存在性能瓶颈。
- 示例:
- 单核 CPU:负载 10 表示 CPU 完全被 10 个进程竞争,系统严重过载。
- 4 核 CPU:负载 10 表示每个核心平均有 2.5 个进程竞争,系统负载较高。
- 16 核 CPU:负载 10 表示系统负载较低(负载值远小于核心数)。
- 负载值与 CPU 核心数的关系:
-
负载为 10 的具体含义
- 负载 10 表示当前系统中有 10 个进程处于运行或等待状态。
- 是否高或低取决于系统的核心数:
- 如果系统是单核或双核:负载 10 明显过高,CPU 可能无法及时处理所有任务,导致响应延迟。
- 如果系统是 8 核或更高:负载 10 相对较低,系统仍有余力处理更多任务。
-
-
如何判断负载是否过高?
-
结合 CPU 核心数判断
使用以下命令查看 CPU 核心数:
nproc # 或 cat /proc/cpuinfo | grep "processor" | wc -l
-
公式:
负载是否过高 = 负载值 > CPU 核心数 × 1.5
-
结合负载趋势分析
- 短期负载(1 分钟):反映即时性能问题,适合快速定位突发瓶颈。
- 长期负载(5/15 分钟):反映系统整体负载趋势,适合分析持续性问题。
-
进一步排查负载来源
-
使用
vmstat
命令:vmstat 1
关注字段:
r
:运行队列中的进程数(若长期大于 CPU 核心数,说明 CPU 不足)。b
:不可中断状态的进程数(若较大,可能有 I/O 瓶颈)。
-
使用
iostat
命令:iostat -x 1
关注字段:
%util
:磁盘使用率(若接近 100%,说明磁盘 I/O 瓶颈)。
-
-
7.系统负载与CPU使用率有什么关联
-
直接关联
-
复杂关联
-
联合分析场景
-
场景 1:CPU 饱和(高使用率 + 高负载)
特征:CPU 使用率接近 100%、负载值远高于 CPU 核心数。
原因:CPU 密集型任务(如编译代码、视频渲染)。
解决方案:优化代码逻辑(减少计算量)、增加 CPU 核心数或升级硬件。
-
场景2:I/O 瓶颈(低 CPU 使用率 + 高负载)
特征:CPU 使用率低(如 20%)、负载值高(如 8.0)。
原因:进程因等待磁盘或网络 I/O 而阻塞。
解决方案:检查磁盘性能(使用
iostat
查看磁盘 I/O 延迟)、使用 SSD 替代 HDD,或优化 I/O 操作(如批量读写)。 -
场景3:CPU 利用不足(低 CPU 使用率 + 低负载)
特征:CPU 使用率低(如 10%)、负载值低(如 0.5)。
原因:系统处于空闲状态。
解决方案:无需优化,系统运行正常。
-
场景 4:锁竞争(低 CPU 使用率 + 高负载)
特征:CPU 使用率低(如 15%)、负载值高(如 6.0)。
原因:多个进程因竞争资源(如文件锁、内存锁)而阻塞。
解决方案:优化资源分配逻辑(减少锁争用)、使用更高效的并发模型(如无锁数据结构)。
-
8.如何查看本机启动了哪些端口,如何使用telnet测试端口是否连通
-
查看本机启动的端口
-
使用
netstat
命令sudo netstat -tuln # 输出示例: Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN udp 0 0 127.0.0.53:53 0.0.0.0:* udp 0 0 192.168.163.140:68 0.0.0.0:*
参数说明:
-t
:显示 TCP 端口。-u
:显示 UDP 端口。-l
:仅显示监听(LISTEN)状态的端口。-n
:以数字形式显示地址和端口(不进行 DNS 解析)。
-
使用
ss
命令sudo ss -tuln
参数说明:
- 参数含义与
netstat
类似,ss
是netstat
的现代替代工具,速度更快。
- 参数含义与
-
使用
lsof
命令sudo lsof -i -P -n
参数说明:
-i
:显示与网络相关的进程。-P
:以端口号而非服务名显示。-n
:不解析主机名。
-
使用
fuser
命令sudo fuser -n tcp 80 # 输出示例: 80/tcp: 5678
参数说明:
-n tcp
:指定协议为 TCP。80
:查看占用 80 端口的进程。
-
-
使用
telnet
测试端口是否连通-
安装
telnet
客户端如果未安装
telnet
,需先安装:sudo apt install telnet
-
测试本机端口
telnet 127.0.0.1 <端口号>
示例:
telnet 127.0.0.1 80
结果解读:
-
连接成功:
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
- 说明:本机 80 端口开放且服务正常。
-
连接失败:
Trying 127.0.0.1... telnet: connect to address 127.0.0.1: Connection refused
- 说明:本机未监听该端口或服务未启动。
-
-
测试远程主机端口
telnet <目标IP地址> <端口号>
示例:
telnet 192.168.163.140 22
结果解读:
-
连接成功:
Trying 192.168.163.140... Connected to 192.168.163.140. Escape character is '^]'. SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
- 说明:目标主机的 22 端口开放且 SSH 服务正常。
-
连接失败:
Trying 192.168.163.140... telnet: connect to address 192.168.1.1: Connection refused
- 说明:目标端口未开放或防火墙阻止连接。
-
-
9.什么是域名,什么是dns,什么是hosts
-
域名(Domain Name)
域名是互联网上用于标识网站或服务的名称,例如
www.example.com
。它通过字符形式替代复杂的 IP 地址(如192.168.1.1
),方便用户记忆和访问。特点:
- 层级结构:
- 顶级域(TLD):如
.com
、.net
、.cn
。 - 二级域:用户注册的主域名,如
example.com
。 - 子域:可自定义的子域名,如
www.example.com
、blog.example.com
。
- 顶级域(TLD):如
- 唯一性:每个域名全球唯一,需通过域名注册商(如阿里云、GoDaddy)注册。
- 品牌标识:域名是网站的品牌标志,直接影响用户信任度和访问体验。
- 层级结构:
-
DNS(Domain Name System,域名系统)
DNS 是互联网的核心服务,负责将域名(如
www.example.com
)解析为对应的 IP 地址(如93.184.216.34
),类似于电话簿的作用。工作原理:
-
递归查询:
-
用户输入域名后,操作系统首先检查本地 Hosts 文件 是否有记录。
-
若无记录,则向配置的 DNS 服务器 发起请求。
-
-
分布式数据库:
- DNS 服务器通过递归查询根域名服务器、顶级域服务器(如
.com
)、权威域名服务器,最终获取目标 IP 地址。
- DNS 服务器通过递归查询根域名服务器、顶级域服务器(如
-
缓存机制:
- DNS 查询结果会缓存一段时间(TTL),减少重复查询的开销。
关键功能:
- 域名解析:将域名转换为 IP 地址。
- 反向解析:将 IP 地址转换为域名(用于日志分析、安全审计)。
- 智能调度:根据用户地理位置或网络运营商返回最优 IP 地址。
- 负载均衡:将流量分配到多个服务器,提升可用性和性能。
常见问题:
- DNS 污染/劫持:域名被错误解析到恶意 IP(如广告页面)。
- DNS 缓存失效:网站更换服务器后,旧 IP 仍被缓存导致访问失败。
-
-
Hosts 文件
Hosts 文件是操作系统本地的一个静态文本文件,用于手动配置域名与 IP 地址的映射关系。它优先于 DNS 解析,常用于测试、屏蔽网站或加速特定域名访问。
工作原理:
- 当用户访问某个域名时,系统会优先检查 Hosts 文件是否有对应记录。
- 如果有,直接使用该 IP 地址;如果没有,才会向 DNS 服务器发起解析请求。
典型用途:
-
测试网站:
修改 Hosts 文件,将域名指向本地或测试服务器的 IP。
示例:
127.0.0.1 www.testsite.com
-
屏蔽广告或恶意网站:
将广告域名映射到本地回环地址(
127.0.0.1
)。示例:
127.0.0.1 ad.example.com
-
绕过 DNS 问题:
在 DNS 服务器故障时,通过 Hosts 文件临时访问目标网站。
注意事项:
- Hosts 文件是静态的,需要手动维护。
- 修改后需刷新 DNS 缓存(Windows 使用
ipconfig /flushdns
,Linux 使用sudo systemd-resolve --flush-caches
)。
-
三者的关系
角色 作用 特点 域名 用户输入的网站名称(如 www.example.com
)易记、品牌标识、需注册 DNS 将域名解析为 IP 地址(如 93.184.216.34
)分布式数据库、动态更新、支持智能调度和负载均衡 Hosts 文件 本地静态配置,手动映射域名与 IP 地址 优先级高于 DNS、无需联网、适合测试和临时屏蔽 访问流程示意图:
用户输入域名 → 检查 Hosts 文件 → 有记录 → 直接访问 ↓ 无记录 → 向 DNS 服务器发起解析 → 获取 IP 地址 → 访问目标服务器
-
总结
- 域名 是互联网的“门牌号”,方便用户记忆和访问网站。
- DNS 是“翻译官”,将域名转换为 IP 地址,是互联网通信的基础。
- Hosts 文件 是本地的“通讯录”,提供静态域名与 IP 的映射,适用于测试和特殊场景。
10.一个域名是如何进行解析的
一个域名的解析过程是通过 DNS(Domain Name System) 完成的,其核心目标是将用户输入的域名(如 www.example.com
)转换为对应的 IP 地址(如 192.0.2.1
),从而让设备能够连接到目标服务器。
以下是详细的解析流程:
-
本地缓存检查
当用户在浏览器中输入域名后,系统会首先检查以下缓存:
- 浏览器缓存:浏览器可能已缓存该域名的解析结果。
- 操作系统缓存(如 Windows 的 DNS 缓存或 Linux 的
systemd-resolve
缓存)。 - 路由器或本地 DNS 服务器缓存(如家庭宽带运营商的 DNS 缓存)。
如果缓存中存在有效的解析记录(未过期),则直接返回对应的 IP 地址,跳过后续步骤。
-
Hosts 文件检查
如果本地缓存未命中,系统会检查 Hosts 文件(如 Windows 的
C:\Windows\System32\drivers\etc\hosts
或 Linux 的/etc/hosts
)。- 如果 Hosts 文件中定义了该域名与 IP 的映射关系,则直接使用该 IP 地址。
- 如果未定义,则进入 DNS 查询流程。
-
递归 DNS 查询
如果本地缓存和 Hosts 文件均未命中,系统会向 递归 DNS 服务器(如运营商提供的 DNS 或公共 DNS 服务,如
8.8.8.8
)发起请求。递归 DNS 服务器会代替用户完成后续的查询过程。 -
根域名服务器查询
递归 DNS 服务器首先向 根域名服务器(全球共 13 组,地址如
198.41.0.4
)发起查询。根域名服务器的作用是:
- 根据域名的顶级域(TLD,如
.com
、.net
)返回对应的 顶级域名服务器(TLD 服务器) 地址。 - 例如,对于
www.example.com
,根域名服务器会返回.com
顶级域名服务器的地址。
- 根据域名的顶级域(TLD,如
-
权威 DNS 服务器查询
递归 DNS 服务器向 权威 DNS 服务器 发起查询。
权威 DNS 服务器的作用是:
- 存储该域名的解析记录(如 A 记录、CNAME 记录等),并返回对应的 IP 地址。
- 例如,
example.com
的权威 DNS 服务器会返回www.example.com
的 IP 地址(如192.0.2.1
)。
-
缓存与返回结果
- 递归 DNS 服务器将获取到的 IP 地址缓存一段时间(由域名的 TTL 值决定,通常为数小时到几天)。
- 最终将解析结果返回给用户的设备,用户通过该 IP 地址访问目标服务器。
-
通信建立
用户的设备通过解析得到的 IP 地址与目标服务器建立 TCP 连接(如 HTTP 请求),获取网站内容。
-
关键概念
-
递归查询 vs. 迭代查询:
-
递归查询:递归 DNS 服务器负责完成整个查询过程,直到返回最终结果。
-
迭代查询:上级 DNS 服务器只返回下一级 DNS 服务器的地址,由客户端或递归 DNS 服务器逐级查询。
-
-
DNS 记录类型:
-
A 记录:域名到 IPv4 地址的映射。
-
AAAA 记录:域名到 IPv6 地址的映射。
-
CNAME 记录:域名到另一个域名的别名(如
www
别名为example.com
)。 -
MX 记录:用于邮件服务器的解析。
-
NS 记录:指定域名的权威 DNS 服务器。
-
-
TTL(Time to Live):
- 每条 DNS 记录都有一个 TTL 值,表示缓存时间。TTL 越短,解析结果更新越快,但会增加 DNS 查询负担。
-
-
常见问题与解决方案
-
DNS 污染/劫持:域名被错误解析到恶意 IP。
- 解决方法:更换 DNS 服务器(如使用
1.1.1.1
或8.8.8.8
)。
- 解决方法:更换 DNS 服务器(如使用
-
DNS 缓存失效:网站更换服务器后,旧 IP 仍被缓存。
- 解决方法:等待 TTL 过期,或手动刷新 DNS 缓存(Windows 使用
ipconfig /flushdns
,Linux 使用systemd-resolve --flush-caches
)。
- 解决方法:等待 TTL 过期,或手动刷新 DNS 缓存(Windows 使用
-
解析速度慢:DNS 查询路径过长或服务器响应慢。
- 解决方法:使用公共 DNS 服务(如 Google DNS、Cloudflare DNS)。
-
12.dig与nslookup有什么区别,什么场景下使用
dig
和 nslookup
都是用于 DNS 查询的命令行工具,但它们的设计目标、功能复杂度和使用场景存在显著差异。
以下是它们的详细对比及适用场景总结:
特性 | dig | nslookup |
---|---|---|
设计目标 | 现代、功能强大,适合复杂查询和故障诊断(默认用于 DNS 管理员)。 | 传统工具,简单易用,适合基础查询(已逐步被 dig 取代)。 |
输出格式 | 详细且结构化,包含技术细节(如响应时间、DNS 服务器地址、TTL 等)。 | 简单直观,但信息较少(默认不显示完整技术细节)。 |
灵活性 | 支持多种选项(如 +trace 跟踪解析过程、+short 简化输出、批量查询等)。 | 功能较少,仅支持基本查询类型(如 A 记录、MX 记录)。 |
交互模式 | 无交互模式,需一次性输入命令。 | 支持交互模式(输入 nslookup 后进入命令行),适合多轮查询。 |
默认行为 | 不查询本地 /etc/hosts 文件(仅依赖 DNS 服务器)。 | 会查询本地 hosts 文件和 DNS 服务器。 |
跨平台兼容性 | 在 Linux/macOS 中默认集成;Windows 需手动安装(如通过 BIND 工具包)。 | Windows 自带(默认安装),Linux/macOS 中需安装 bind-utils 。 |
推荐使用场景 | DNS 故障排查、详细记录分析、批量查询、调试复杂 DNS 配置。 | 快速获取基础 DNS 信息(如 IP 地址、邮件服务器地址)。 |
-
功能对比
- 查询能力
- dig
- 支持 任意 DNS 记录类型(A、AAAA、CNAME、MX、TXT、PTR 等)。
- 支持 反向解析(
dig -x IP
)。 - 支持 指定 DNS 服务器(
@DNS_IP
)。 - 支持 追踪解析路径(
+trace
)。 - 支持 批量查询(通过
-f
指定文件)。
- nslookup
- 支持基本记录类型(A、MX、CNAME、NS 等)。
- 支持反向解析(直接输入 IP)。
- 支持指定 DNS 服务器(
nslookup domain DNS_IP
)。 - 交互模式下可切换查询类型(如
set type=MX
)。
- dig
- 典型场景
- dig 的优势场景:
- 需要 跟踪域名解析全过程(
+trace
)。 - 需要 批量查询多个域名或记录类型。
- 需要 排除本地 hosts 文件干扰(仅依赖 DNS 服务器)。
- 需要 调试 DNS 服务器配置问题(如 TTL、响应时间等)。
- 需要 跟踪域名解析全过程(
- nslookup 的优势场景:
- 快速获取 单条 DNS 记录(如 A 记录、MX 记录)。
- Windows 用户无需安装额外工具。
- 简单的 反向解析(IP → 域名)。
- dig 的优势场景:
- 查询能力
-
使用建议
需求 推荐工具 原因 快速获取某个域名的 IP 地址 nslookup
简单直接,无需复杂参数。 调试 DNS 解析链路(如 TTL、路径) dig
支持 +trace
追踪解析过程,输出详细技术信息。查询邮件服务器(MX 记录) dig
或nslookup
均支持,但 dig
输出更清晰(如dig google.com MX
)。批量查询多个域名 dig
支持 -f
参数读取文件批量查询。Windows 系统下临时查询 nslookup
默认集成,无需额外安装。 需要排除 hosts 文件影响 dig
dig
不查询 hosts 文件,结果更纯粹。 -
常见命令示例
-
查询 A 记录
-
dig
dig example.com A # 或简化输出 dig +short example.com
-
nslookup
nslookup example.com
-
-
查询 MX 记录
-
dig
dig example.com MX
-
nslookup
nslookup -query=MX example.com
-
-
反向解析(IP → 域名)
-
dig
dig -x 142.250.179.174
-
nslookup
nslookup 142.250.179.174
-
-
指定 DNS 服务器
-
dig
dig @8.8.8.8 example.com
-
nslookup
nslookup example.com 8.8.8.8
-
-
追踪解析路径
- dig
dig example.com +trace
-
13.什么是三次握手和四次挥手,什么场景下使用
-
三次握手(建立连接)
TCP 是面向连接的协议,三次握手是客户端和服务器之间建立可靠通信的初始化过程,确保双方具备发送和接收数据的能力,并同步初始序列号(ISN)。
三次握手流程
- 第一次握手(SYN)
- 客户端发送
SYN=1
(同步标志位),携带随机初始序列号seq=x
,进入SYN_SENT
状态。 - 目的:请求建立连接,表明客户端准备好发送数据。
- 客户端发送
- 第二次握手(SYN-ACK)
- 服务器收到
SYN
后,发送SYN=1
和ACK=1
(确认标志位),携带自己的初始序列号seq=y
,并确认客户端的序号ack=x+1
,进入SYN_RCVD
状态。 - 目的:同意连接请求,并同步服务器的初始序列号。
- 服务器收到
- 第三次握手(ACK)
- 客户端收到
SYN-ACK
后,发送ACK=1
,确认服务器的序号ack=y+1
,进入ESTABLISHED
状态。 - 服务器收到
ACK
后,也进入ESTABLISHED
状态。 - 目的:确认连接建立成功,双方可以开始数据传输。
- 客户端收到
为什么需要三次握手?
- 防止资源浪费:
如果只有两次握手(客户端发SYN
,服务器回复SYN-ACK
),服务器可能会因客户端未响应而一直处于等待状态。三次握手通过客户端的最终确认(第三次握手),确保服务器不会为无效连接分配资源。 - 防止已失效的连接请求:
若客户端的SYN
报文因网络延迟被重复发送,服务器收到后可能误认为是新请求。三次握手通过客户端的确认(第三次握手)可避免此类问题。
- 第一次握手(SYN)
-
四次挥手(断开连接)
四次挥手是 TCP 连接终止的过程,确保双方都能安全关闭连接,避免数据丢失或资源浪费。
四次挥手流程
- 第一次挥手(FIN)
- 客户端发送
FIN=1
(结束标志位),表示数据发送完毕,进入FIN_WAIT_1
状态。
- 客户端发送
- 第二次挥手(ACK)
- 服务器收到
FIN
后,发送ACK=1
,确认序号ack=u+1
(u
是客户端的FIN
序号),进入CLOSE_WAIT
状态。 - 客户端收到
ACK
后,进入FIN_WAIT_2
状态。
- 服务器收到
- 第三次挥手(FIN)
- 服务器发送
FIN=1
,表示自己数据也发送完毕,进入LAST_ACK
状态。
- 服务器发送
- 第四次挥手(ACK)
- 客户端发送
ACK=1
,确认序号ack=w+1
(w
是服务器的FIN
序号),进入TIME_WAIT
状态,等待 2MSL(最大报文段生存时间)后关闭连接。 - 服务器收到
ACK
后,立即关闭连接。
- 客户端发送
为什么需要四次挥手?
- 全双工通信的特性:
TCP 是全双工的,双方独立关闭发送通道。客户端先发送FIN
关闭自己的发送通道,但服务器可能仍有数据要发送,需等待服务器主动关闭连接。 - 确保数据可靠传输:
通过四次挥手,双方都能确认对方已收到关闭请求,避免数据丢失或连接残留。
- 第一次挥手(FIN)
-
使用场景
-
1. 三次握手的典型场景
-
网页访问:
浏览器与服务器建立 TCP 连接,加载网页内容(如 HTML、图片、视频)。 -
即时通讯:
QQ、微信等客户端与服务器建立连接,发送消息或文件。 -
远程登录:
SSH 协议通过三次握手建立安全连接,实现远程操作。 -
数据库连接:
Java 程序通过 JDBC 连接 MySQL 数据库,执行查询或更新操作。
-
-
2. 四次挥手的典型场景
-
网页关闭:
用户关闭浏览器后,客户端与服务器断开连接。 -
聊天结束:
用户退出聊天软件,客户端与服务器释放连接资源。 -
文件传输完成:
FTP 客户端完成文件上传/下载后,主动关闭连接。 -
服务端主动断开:
服务器检测到客户端异常(如超时),主动发送FIN
终止连接。
-
-
-
关键补充
- TIME_WAIT 状态:
- 客户端在四次挥手后进入
TIME_WAIT
状态,持续 2MSL(默认 2 分钟),确保网络中残留的报文段失效,避免干扰新连接。 - 作用:防止旧连接的
FIN
报文段被延迟后误认为是新连接的请求。
- 客户端在四次挥手后进入
- SYN Flood 攻击:
- 攻击者发送大量伪造的
SYN
请求,导致服务器资源耗尽。 - 防御措施:限制
SYN
重传次数(tcp_synack_retries
)、使用防火墙过滤异常流量。
- 攻击者发送大量伪造的
- 半关闭状态:
- 在四次挥手过程中,客户端发送
FIN
后,服务器仍可发送数据,此时连接处于 半关闭 状态(CLOSE_WAIT
)。
- 在四次挥手过程中,客户端发送
- TIME_WAIT 状态:
14.TCP与UDP有什么区别
-
核心区别
特性 TCP UDP 连接方式 面向连接(需三次握手建立连接) 无连接(直接发送数据包) 可靠性 可靠传输(确认、重传、排序、去重) 不可靠传输(可能丢包、乱序、重复) 流量控制 支持(滑动窗口机制,避免接收方过载) 无流量控制 拥塞控制 支持(动态调整发送速率避免网络拥塞) 无拥塞控制(可能加剧网络拥塞) 数据边界 字节流模式(无明确数据包边界) 数据报模式(保留发送时的数据包边界) 头部开销 较大(20-60字节,包含序列号、确认号等字段) 极小(固定8字节,仅基础信息) 传输效率 较低(因握手、确认、重传等机制) 较高(无额外控制机制,延迟更低) 多播/广播支持 仅支持单播 支持单播、多播、广播 资源消耗 较多(维护连接状态、控制机制复杂) 较少(无需维护连接状态) -
工作机制对比
-
典型应用场景
-
TCP 的适用场景
需要高可靠性的场景:
- Web 浏览(HTTP/HTTPS):确保网页内容完整加载。
- 文件传输(FTP/SFTP):保证文件数据不丢失或损坏。
- 电子邮件(SMTP/IMAP):邮件内容必须准确传递。
- 数据库操作:事务性操作需严格保证数据一致性。
长连接通信:
- 远程终端(SSH/Telnet):用户输入需按序到达服务器。
- API 调用(REST/gRPC):依赖可靠的双向通信。
-
UDP 的适用场景
实时性优先于可靠性的场景:
- 音视频流媒体(Zoom、直播):容忍少量丢包,但要求低延迟。
- 在线游戏(MOBA、FPS):快速传输玩家操作,通过应用层补偿丢包。
- VoIP(如 Skype):语音通话中延迟比偶尔杂音更影响体验。
轻量级或广播通信:
- DNS 查询:快速解析域名,单个请求-响应无需复杂连接。
- 物联网传感器数据:周期性发送小数据包(如温度传感器)。
- DHCP:局域网内动态分配 IP 地址。
-
15.UDP会进行握手吗
UDP(用户数据报协议)不会进行握手。与TCP不同,UDP是一种无连接的协议,这意味着在发送数据之前,发送方和接收方之间不需要建立连接,也不需要通过握手(如TCP的三次握手)来同步通信状态。
-
为什么UDP不需要握手?
-
无连接特性:
- UDP在发送数据时,只需要知道接收方的IP地址和端口号,直接发送数据报即可,无需预先建立连接。
- 例如:就像寄送快递时直接把包裹投递到对方门口,不需要先打电话确认对方是否在家。
-
低延迟和高效性:
- 握手过程(如TCP的三次握手)会增加通信开销和延迟。对于实时性要求高的场景(如视频通话、在线游戏),UDP的直接传输能显著降低延迟。
- UDP的头部仅有8字节(相比TCP的20-60字节),进一步减少了开销。
-
不可靠传输:
- UDP不保证数据的可靠性、顺序性和完整性,因此无需通过握手协商连接参数(如初始序列号、窗口大小等)。
- 如果数据丢失或乱序,UDP不会重传或排序,由上层应用自行处理。
-
16.什么服务默认使用UDP协议
-
DNS(域名系统)
-
用途:将域名转换为IP地址(如
www.example.com
→93.184.216.34
)。例外情况:当DNS响应数据超过512字节时(如较大的DNSSEC记录),会切换到TCP。
-
-
DHCP(动态主机配置协议)
- 用途:为网络设备自动分配IP地址、子网掩码、网关等配置。
-
TFTP(简单文件传输协议)
- 用途:传输小型文件(如路由器固件升级、引导文件)。
-
NTP(网络时间协议)
- 用途:同步计算机和网络设备的时间。
-
SNMP(简单网络管理协议)
- 用途:监控和管理网络设备(如路由器、交换机)。
-
RIP(路由信息协议)
- 用途:在小型网络中动态更新路由表。
-
组播服务(Multicast)
- 用途:向一组特定设备同时发送数据(如流媒体、在线游戏广播)。
-
实时音视频服务
- 典型场景:VoIP(如Zoom、Skype)、在线游戏(如《英雄联盟》)、直播平台。
服务 | 协议 | 默认端口 | 核心优势 |
---|---|---|---|
DNS | UDP | 53 | 快速响应,适合小数据包 |
DHCP | UDP | 67/68 | 支持广播,简化配置 |
TFTP | UDP | 69 | 适合嵌入式设备,无连接开销 |
NTP | UDP | 123 | 低延迟,高精度时间同步 |
SNMP | UDP | 161/162 | 高效监控,适合小数据传输 |
RIP | UDP | 520 | 简化路由协议实现 |
组播 | UDP | 动态分配 | 高效一对多通信 |
实时音视频 | UDP | 动态分配 | 低延迟,容忍少量丢包 |
17.视频通话会使用TCP还是UDP,文字消息呢?
-
视频通话:通常使用 UDP
原因:
- 实时性要求高:视频通话(如语音、视频流)需要低延迟,丢包比延迟更可接受。
- UDP 无连接、无需握手,直接发送数据包,减少延迟。
- TCP 的三次握手和确认重传机制会显著增加延迟,不适合实时通信。
- 容忍少量丢包:
- 视频通话中,偶尔丢失一两个数据包(如帧)对用户体验影响较小,而 TCP 的重传会导致更大延迟。
- 例如,WebRTC(用于实时音视频通信的框架)默认使用 UDP。
- 支持组播/多点通信:
- UDP 支持一对多(组播)通信,适合多人视频会议场景。
典型技术:
- WebRTC:基于 UDP 实现 P2P 音视频传输(如 Zoom、微信视频通话)。
- VoIP(网络电话):如 Skype、QQ 语音通话,使用 UDP 传输语音数据。
- 实时性要求高:视频通话(如语音、视频流)需要低延迟,丢包比延迟更可接受。
-
文字消息:通常使用 TCP
原因:
- 可靠性要求高:
- 文字消息(如聊天记录)必须完整、有序地送达,不允许丢包或乱序。
- TCP 的确认机制、重传机制和有序交付特性可以保证消息不丢失。
- 无实时性压力:
- 文字消息的传输延迟对用户体验影响较小,TCP 的延迟可以接受。
- 例如,微信文字聊天基于 TCP,确保每条消息都能正确送达。
例外情况:
- QQ 文字聊天:根据抓包分析,QQ 使用 UDP 传输文字消息。
- 可能原因:QQ 可能通过自定义协议在 UDP 上实现可靠性(如手动重传、确认机制),以降低延迟。
- 加密保护:消息内容加密,即使丢包或乱序,也能通过协议层修复。
- 可靠性要求高:
18.解释ps -aux所有字段的含义
字段 | 含义 | 典型用途 |
---|---|---|
USER | 进程所属用户 | 识别资源占用者 |
PID | 进程唯一标识符 | 终止或管理进程 |
%CPU | CPU 占用百分比 | 查找 CPU 密集型进程 |
%MEM | 内存占用百分比 | 查找内存泄漏或内存占用高进程 |
VSZ | 虚拟内存大小 | 评估进程总内存需求 |
RSS | 实际物理内存大小 | 直接反映内存消耗 |
TTY | 关联的终端设备 | 判断进程是否与终端相关 |
STAT | 进程状态 | 诊断进程是否卡死或异常 |
START | 进程启动时间 | 跟踪进程运行时长 |
TIME | 累计 CPU 时间 | 统计进程的 CPU 使用量 |
COMMAND | 启动进程的命令或程序名 | 识别进程功能或来源 |
-
实际应用场景
-
性能监控:
- 使用
ps aux --sort=-%cpu
按 CPU 占用率降序排列,快速定位资源占用高的进程。 - 使用
ps aux --sort=-%mem
按内存占用率排序,排查内存泄漏。
- 使用
-
故障排查:
- 检查是否存在
D
状态(不可中断睡眠)的进程,可能是 I/O 阻塞导致。 - 查找
Z
僵尸进程,需终止父进程或重启服务。
- 检查是否存在
-
进程管理:
- 通过
kill PID
终止异常进程。 - 使用
ps aux | grep nginx
过滤特定进程(如 Nginx)。
- 通过
-
19.Linux中如何判断上一条命令是否执行成功
-
使用
$?
变量(最常用)# 执行命令 command # 立即查看退出状态码 echo $?
原理:每个命令执行后会返回一个退出状态码(Exit Code),存储在特殊变量$?中:
0
:命令执行成功。- 非
0
:命令执行失败(具体数值可能表示不同错误)。
-
使用日志文件
原理:将命令的输出或错误信息重定向到日志文件,后续检查日志内容。
示例:
# 将标准输出和错误输出写入日志文件 command > output.log 2>&1 # 查看日志文件 cat output.log
解释:
>
:重定向标准输出(STDOUT)。2>&1
:将标准错误(STDERR)重定向到标准输出。
20.如何修改系统默认时区,并同步网络时间
-
修改系统默认时区
-
使用
timedatectl
命令-
查看当前时区和可用时区:
timedatectl # 输出: Local time: Tue 2025-07-15 07:06:39 UTC Universal time: Tue 2025-07-15 07:06:39 UTC RTC time: Tue 2025-07-15 07:06:39 Time zone: Etc/UTC (UTC, +0000) System clock synchronized: yes NTP service: active RTC in local TZ: no
-
列出所有可用时区:
timedatectl list-timezones # 示例(搜索亚洲时区): timedatectl list-timezones | grep Asia
-
设置新时区(以中国标准时间
Asia/Shanghai
为例):sudo timedatectl set-timezone Asia/Shanghai
-
验证修改:
timedatectl # 输出: Local time: Tue 2025-07-15 15:09:07 CST Universal time: Tue 2025-07-15 07:09:07 UTC RTC time: Tue 2025-07-15 07:09:07 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no
-
-
-
同步网络时间
-
验证配置
-
检查系统时间和时区:
date timedatectl
-
检查硬件时钟(RTC)是否同步:
sudo hwclock --show
-
21.如何使用curl访问页面
-
最基础的 GET 请求
curl https://www.baidu.com
作用:向
https://www.baidu.com
发送一个默认的GET
请求,并输出服务器返回的内容。 -
查看响应头信息
curl -I https://www.baidu.com
作用:仅获取服务器的响应头信息(如 HTTP 状态码、Content-Type 等)。
-
保存网页内容到文件
curl -o baidu.html https://www.baidu.com
作用:将
https://www.baidu.com
的内容保存到本地文件baidu.html
中。 -
发送 POST 请求
-
提交表单数据
# 登录一个表单接口 curl -X POST https://api.example.com/login \ -d "username=test&password=123"
作用:向服务器提交表单数据(默认格式为
application/x-www-form-urlencoded
)。 -
提交 JSON 数据
curl -X POST https://api.example.com/create \ -H "Content-Type: application/json" \ -d '{"name":"Alice", "age":30}'
作用:提交 JSON 格式的数据(需手动指定
Content-Type
)。
-
-
添加自定义请求头
curl -H "User-Agent: MyApp/1.0" https://example.com
作用:修改请求头中的
User-Agent
字段(模拟浏览器或其他客户端)。 -
使用 Cookie
curl -b "session_id=12345" https://example.com
作用:向服务器发送 Cookie(用于保持登录状态)。
-
处理 HTTPS 认证
-
跟随重定向
curl -L https://short.url
作用:自动跟随 HTTP 重定向(如 301/302 状态码)。
-
常见问题
Q1: 如何查看 curl 的版本?
curl --version
Q2: 如何调试请求?
使用
-v
参数查看详细请求和响应过程:curl -v https://example.com
Q3: 如何发送 DELETE 请求?
curl -X DELETE https://api.example.com/resource/123
22.如何使用curl和wget来下载文件到本地。
-
使用
curl
下载文件-
基本用法
-
下载并保留原文件名:
curl -O https://example.com/file.txt
-O
:自动使用 URL 中的文件名(如file.txt
)保存到当前目录。 -
自定义保存路径和文件名:
curl -o /path/to/save/newfile.txt https://example.com/file.txt
-o
:指定本地保存的路径和文件名(小写o
)。
-
-
处理重定向
-
跟随重定向(如短链接跳转):
curl -L -O https://short.url/file.txt
-L
:自动跟随 HTTP 重定向(301/302 状态码)。
-
-
断点续传
-
恢复中断的下载:
curl -C - -O https://example.com/largefile.zip
-C -
:从上次中断的位置继续下载(适用于大文件)。
-
-
验证 SSL 证书
-
跳过 SSL 证书验证(仅限测试环境):
curl -k -O https://self-signed-certificate.com/file.txt
-k
:忽略 SSL 证书错误(不推荐生产环境使用)。
-
-
带认证的下载
-
使用用户名和密码认证:
curl -u username:password -O https://secure.example.com/protected_file.txt
-u
:指定认证凭据(格式为username:password
)。
-
-
显示进度条
-
实时显示下载进度:
curl -# -O https://example.com/largefile.zip
-#
:显示进度条(适用于终端环境)。
-
-
-
使用
wget
下载文件-
基本用法
-
下载并保留原文件名:
wget https://example.com/file.txt
-
自定义保存路径和文件名:
wget -O /path/to/save/newfile.txt https://example.com/file.txt
-O
:指定本地保存的路径和文件名(大写O
)。
-
-
断点续传
恢复中断的下载:
wget -c https://example.com/largefile.zip
-c
:从上次中断的位置继续下载。 -
静默下载
不显示进度信息(适合脚本):
wget -q https://example.com/file.txt
-q
:静默模式(无输出)。 -
显示进度条
显示下载进度:
wget --show-progress https://example.com/largefile.zip
-
带认证的下载
使用用户名和密码认证:
wget --user=username --password=password https://secure.example.com/protected_file.txt
-
批量下载
从文件读取多个 URL 下载:
wget -i urls.txt
urls.txt
:每行包含一个文件的 URL(如https://example.com/file1.txt
)。
-
-
常见问题与解决方案
-
文件名乱码或路径错误
-
问题:下载的文件名乱码或路径无效。
-
解决:确保 URL 正确,手动指定
-o
或-O
参数。示例:
curl -o /home/user/downloads/report.pdf "https://site.com/monthly/report.pdf"
-
-
路径包含空格或特殊字符
-
问题:路径中包含空格导致命令解析错误。
-
解决:使用双引号包裹路径。
示例(Windows):
curl -o "C:\Temp Folder\file.zip" "https://host/special.zip"
-
-
权限不足
-
问题:无法写入目标目录。
-
解决:使用
sudo
提升权限(Linux/macOS):sudo wget -O /usr/local/bin/ollama-linux-amd64.tgz https://ollama.com/download/ollama-linux-amd64.tgz
-
-
代理设置
-
问题:网络需要通过代理访问。
-
解决:
-
curl
:curl -x http://proxy.example.com:8080 -O https://example.com/file.txt
-
wget
:wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 https://example.com/file.txt
-
-
-
验证文件完整性
-
问题:下载后需确认文件未被篡改。
-
解决:使用
sha256sum
校验文件哈希值(需官方提供校验值):sha256sum ollama-linux-amd64.tgz
-
-
-
curl和wget的区别
-
核心功能与设计理念
特性 curl
wget
核心定位 多功能的数据传输工具,支持多种网络协议和复杂操作。 专注于文件下载,功能简单直接,适合批量下载和递归下载。 主要用途 调试 API、发送请求(GET/POST/PUT 等)、上传/下载文件、处理复杂网络任务。 下载文件、镜像网站、递归下载、断点续传等自动化下载任务。 输出方式 默认将响应内容输出到终端(标准输出),需通过参数保存到文件。 直接将文件保存到本地磁盘,无需额外参数。 -
协议支持
协议 curl
wget
HTTP/HTTPS ✅ ✅ FTP/FTPS ✅ ✅ SFTP ✅ ❌ SMTP/IMAP/POP3 ✅ ❌ LDAP ✅ ❌ RTSP/Gopher ✅ ❌ curl
支持更广泛的协议(如 SFTP、SMTP、LDAP 等),适合处理复杂网络请求。
/site.com/monthly/report.pdf"
-
路径包含空格或特殊字符
-
问题:路径中包含空格导致命令解析错误。
-
解决:使用双引号包裹路径。
示例(Windows):
curl -o "C:\Temp Folder\file.zip" "https://host/special.zip"
-
-
权限不足
-
问题:无法写入目标目录。
-
解决:使用
sudo
提升权限(Linux/macOS):sudo wget -O /usr/local/bin/ollama-linux-amd64.tgz https://ollama.com/download/ollama-linux-amd64.tgz
-
-
代理设置
-
问题:网络需要通过代理访问。
-
解决:
-
curl
:curl -x http://proxy.example.com:8080 -O https://example.com/file.txt
-
wget
:wget -e use_proxy=yes -e http_proxy=http://proxy.example.com:8080 https://example.com/file.txt
-
-
-
验证文件完整性
-
问题:下载后需确认文件未被篡改。
-
解决:使用
sha256sum
校验文件哈希值(需官方提供校验值):sha256sum ollama-linux-amd64.tgz
-
-
-
curl和wget的区别
-
核心功能与设计理念
特性 curl
wget
核心定位 多功能的数据传输工具,支持多种网络协议和复杂操作。 专注于文件下载,功能简单直接,适合批量下载和递归下载。 主要用途 调试 API、发送请求(GET/POST/PUT 等)、上传/下载文件、处理复杂网络任务。 下载文件、镜像网站、递归下载、断点续传等自动化下载任务。 输出方式 默认将响应内容输出到终端(标准输出),需通过参数保存到文件。 直接将文件保存到本地磁盘,无需额外参数。 -
协议支持
协议 curl
wget
HTTP/HTTPS ✅ ✅ FTP/FTPS ✅ ✅ SFTP ✅ ❌ SMTP/IMAP/POP3 ✅ ❌ LDAP ✅ ❌ RTSP/Gopher ✅ ❌ curl
支持更广泛的协议(如 SFTP、SMTP、LDAP 等),适合处理复杂网络请求。wget
主要支持 HTTP、HTTPS 和 FTP,适合常规下载任务。
-