第四周
1. 通过网络配置命令,让主机可以上网
配置网络需要设置IP地址、子网掩码、网关和DNS服务器。以下是相关命令总结:
# 设置IP地址和子网掩码
ifconfig eth0 10.0.0.10 netmask 255.255.255.0
# 设置默认网关
route add default gw 10.0.0.2
# 设置DNS服务器(编辑 /etc/resolv.conf 文件)
echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf
# 永久设置主机名
hostnamectl set-hostname rocky
2. 解析 /etc/sysconfig/network-scripts/ifcfg-eth0 配置格式
这是一个网络接口配置文件,以下是常见字段的含义:
BOOTPROTO=static # 设置为静态IP
IPADDR=10.0.0.100 # IP地址
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=10.0.0.2 # 默认网关
DNS1=8.8.8.8 # 主DNS服务器
DNS2=8.8.4.4 # 备用DNS服务器
ONBOOT=yes # 系统启动时激活该接口
3. 基于配置文件或命令完成 bond0 配置
bond0 是一个网络绑定接口,用于将多个物理接口绑定在一起,提高带宽和冗余性。以下是配置文件示例:
# /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.0.0.100
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
BONDING_OPTS="mode=1 miimon=100"
物理接口配置文件(如 ifcfg-eth0 和 ifcfg-eth1)需要设置 MASTER=bond0 和 SLAVE=yes。
4. 通过 ifconfig 命令结果找到 IP 地址
ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -d: -f2
5. 使用脚本判断主机所在网络内在线的主机 IP
#!/bin/bash
for ip in $(seq 1 254); do
ping -c 1 10.0.0.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "10.0.0.$ip is online"
fi
done
6. 使用 while read line 和 /etc/passwd,计算用户 ID 总和
#!/bin/bash
sum=0
while IFS=: read -r user pass uid gid info home shell; do
sum=$((sum + uid))
done < /etc/passwd
echo "Sum of user IDs: $sum"
7. 总结索引数组和关联数组,字符串处理,高级变量使用及示例
索引数组
#!/bin/bash
arr=(apple banana cherry)
echo "Element at index 1: ${arr[1]}"
关联数组
#!/bin/bash
declare -A assoc
assoc[name]="John"
assoc[age]=30
echo "Name: ${assoc[name]}, Age: ${assoc[age]}"
字符串处理
#!/bin/bash
str="Hello, World!"
echo "Length: ${#str}"
echo "Substring: ${str:0:5}"
高级变量
#!/bin/bash
read -p "Enter your name: " name
echo "Hello, $name"
8. 求 10 个随机数的最大值与最小值
#!/bin/bash
max=-999999
min=999999
for i in $(seq 1 10); do
num=$((RANDOM % 100))
echo "Random number: $num"
if [ $num -gt $max ]; then
max=$num
fi
if [ $num -lt $min ]; then
min=$num
fi
done
echo "Max: $max, Min: $min"
9. 使用递归调用,完成阶乘算法实现
#!/bin/bash
factorial() {
if [ $1 -le 1 ]; then
echo 1
else
local temp=$(( $1 - 1 ))
local result=$(factorial $temp)
echo $(( $1 * result ))
fi
}
echo $(factorial 5)
10. 解析进程和线程的区别?解析进程的结构
进程和线程的区别
- 进程:是操作系统分配资源的基本单位,拥有独立的内存空间。
- 线程:是进程内的执行单元,共享进程的内存空间,开销较小。
进程的结构
- 程序计数器(PC):记录当前执行的指令地址。
- 寄存器集合:保存线程的上下文信息。
- 堆栈:用于函数调用和局部变量存储。
- 内存空间:包括代码段、数据段和堆。
11. 结合进程管理命令,说明进程各种状态
常用进程管理命令
ps:显示当前进程状态。top:实时显示系统进程。kill:终止进程。
进程状态
- R(Running):正在运行或在运行队列中等待。
- S(Sleeping):处于休眠状态。
- D(Disk Sleep):不可中断的休眠状态。
- Z(Zombie):僵尸进程,已终止但父进程尚未读取状态信息。
- T(Stopped):被停止的进程。
12. 说明 IPC 通信和 RPC 通信实现的方式
IPC 通信
- 管道(Pipe):用于父子进程或兄弟进程间通信。
- 消息队列(Message Queue):存储消息的链表,进程通过消息队列发送和接收消息。
- 共享内存(Shared Memory):允许多个进程共享同一块内存区域。
- 信号量(Semaphore):用于进程间同步。
RPC 通信
- 远程过程调用(RPC):客户端通过网络向服务器发送请求,服务器执行请求并返回结果。
- 实现方式:通过网络协议(如 HTTP、TCP/IP)和序列化技术(如 JSON、XML)实现。
13. 总结 Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换
前台和后台作业的区别
- 前台作业:与终端交互,阻塞终端。
- 后台作业:在后台运行,不阻塞终端。
状态转换
- 将前台作业转为后台:使用
Ctrl+Z,然后bg。 - 将后台作业转为前台:使用
fg。
14. 实现定时任务,每日凌晨 1 点,删除指定文件
# 编辑 crontab 文件
crontab -e
# 添加定时任务
0 1 * * * rm /tmp/text.txt
15. 实现定时任务每月月初对指定文件进行压缩
# 编辑 crontab 文件
crontab -e
# 添加定时任务
0 0 1 * * tar -czf /opt/txt.tar.gz /tmp/txt
16. 通过 Shell 编程完成,30 鸡和兔的头,80 鸡和兔的脚,分别有几只鸡,几只兔?
#!/bin/bash
for chicken in $(seq 0 30); do
rabbit=$((30 - chicken))
if [ $((2 * chicken + 4 * rabbit)) -eq 80 ]; then
echo "Chicken: $chicken, Rabbit: $rabbit"
break
fi
done
17. 结合编程的 for 循环,条件测试,条件组合,完成批量创建 100 个用户
#!/bin/bash
for i in $(seq 1 100); do
if id user$i > /dev/null 2>&1; then
echo "用户$i已存在."
else
useradd $i
echo "用户$i已添加."
fi
done
18. 练习题:练习 top,htop,iotop,iostat 等课程相关工具的使用
top
- 显示系统进程和资源使用情况。
- 常用命令:
top -u username(显示指定用户的进程)。
htop
- 更直观的进程管理工具。
- 支持交互式操作,如杀死进程。
iotop
- 显示磁盘 I/O 使用情况。
- 常用命令:
iotop -o(仅显示有 I/O 活动的进程)。
iostat
- 显示 CPU 和磁盘 I/O 使用情况。
- 常用命令:
iostat -x 1(每秒刷新一次详细信息)。

浙公网安备 33010602011771号