一、通过网络配置命令让主机上网
1. 查看网络接口信息:
- `ip a`或者`ifconfig`显示系统中所有网络接口的详细信息,包括 IP 地址、子网掩码、MAC 地址等。
2. 配置 IP 地址、子网掩码、网关和 DNS:
- IP 地址:使用`ifconfig`或`ip a a`命令来设置 IP 地址。例如,`ifconfig eth0 192.168.1.100 netmask 255.255.255.0`设置 eth0 接口的 IP 地址为 192.168.1.100,子网掩码为 255.255.255.0。
- 子网掩码:在设置 IP 地址时同时指定子网掩码,如上述命令中的`netmask 255.255.255.0`。
- 网关:编辑`/etc/sysconfig/network`文件,添加`GATEWAY=192.168.1.1`来设置网关地址。
- DNS:编辑`/etc/resolv.conf`文件,添加`nameserver 8.8.8.8`来设置 DNS 服务器地址。
3. 设置主机名:
- 使用`hostnamectl set-hostname Rocky`命令来设置主机名,其中`Rocky`为新的主机名。
在NAT模式下指定网关可通过宿主机访问互联网
二、解析/etc/sysconfig/network-scripts/ifcfg-eth0 配置格式
/etc/sysconfig/network-scripts/ifcfg-eth0 是 Linux 系统中网络接口的配置文件,常见的配置项如下:
- `DEVICE`:eth0 网络接口名称,如 eth0。
- `BOOTPROTO`:none 启动协议,可选值有`static`(静态 IP)、`dhcp`(动态获取 IP)等。
- `IPADDR`:192.168.1.100 IP 地址。
- `NETMASK`:255.255.255.0 子网掩码。
- `GATEWAY`:192.168.1.1 网关地址。
- `DNS1`、`DNS2` 8.8.8.8 114.114.114.114 等:DNS 服务器地址。
- `ONBOOT`:yes 是否在系统启动时激活该网络接口,可选值为`yes`或`no`。
三、基于配置文件或命令完成 bond0 配置
1. 使用配置文件:
- 创建 bond0 的配置文件`/etc/sysconfig/network-scripts/ifcfg-bond0`
DEVICE=bond0
BOOTPROTO=none
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
USERCTL=no
BONDING_OPTS="mode=1 miimon=100"
- 其中`mode=1`表示主备模式,`miimon=100`表示每 100 毫秒检查一次链路状态。
- 然后在每个物理接口的配置文件(`ifcfg-eth1`和`ifcfg-eth2`)中添加以下内容:
DEVICE=eth1/eth2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
2. 使用命令:
- 安装 bonding 模块:`modprobe bonding`。
- 创建 bond0:`ip link add bond0 type bond`。
- 设置 bond0 的 IP 地址等参数:`ip addr add 192.168.1.100/24 dev bond0`。
- 激活 bond0:`ip link set bond0 up`。
- 将物理接口添加到 bond0:`ip link set eth1 master bond0`和`ip link set eth2 master bond0`。
- 设置 bonding 模式:`echo "mode=1 miimon=100" > /sys/class/net/bond0/bonding/mode`。
四、通过 ifconfig 命令结果找到 IP 地址
执行`ifconfig`命令后,输出中会显示每个网络接口的信息
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::20c:29ff:fe00:0 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:00:00:00 txqueuelen 1000 (Ethernet)
RX packets 1234 bytes 123456
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 123 bytes 12345
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
其中`inet`后面的地址就是该接口的 IP 地址,在这个例子中,eth0 的 IP 地址是 192.168.1.100。
五、使用脚本判断主机所在网络内在线的主机 IP 有哪些
#!/bin/bash
network=$(ip addr show | grep "inet " | awk '{print $2}' | cut -d '/' -f 1 | cut -d '.' -f 1-3).0/24
for ip in $(seq 1 254); do
ping -c 1 ${network}.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "${network}.$ip is online"
fi
done
六、使用 while read line 和 /etc/passwd,计算用户 ID 总和
#!/bin/bash
sum=0
while read line; do
uid=$(echo $line | cut -d ':' -f 3)
sum=$((sum + uid))
done < /etc/passwd
echo "Total user ID sum: $sum"
七、总结索引数组和关联数组,字符串处理,高级变量使用及示例
1. 索引数组:
定义:索引数组是一种以数字为索引的数组。在 Bash 中,可以使用`declare -a`来声明一个索引数组。
declare -a numbers=(1 2 3 4 5)
echo ${numbers[0]} # 输出 1
```
2. 关联数组:
定义:关联数组是一种以字符串为索引的数组。在 Bash 中,可以使用`declare -A`来声明一个关联数组。
declare -A colors
colors["red"]="FF0000"
colors["green"]="00FF00"
echo ${colors["red"]} # 输出 FF0000
```
3. 字符串处理:
- 截取字符串:可以使用`${string:start:length}`来截取字符串。例如,`${string:3:5}`表示从字符串的第 3 个字符开始截取 5 个字符。
- 查找字符串:可以使用`expr index "$string" "$substring"`来查找子字符串在字符串中的位置。如果子字符串不存在,则返回 0。
- 替换字符串:可以使用`${string/substring/replacement}`来替换字符串中的子字符串。例如,`${string/old/new}`表示将字符串中的`old`替换为`new`。
4. 高级变量使用:
- 变量间接引用:可以使用`${!varname}`来间接引用变量。例如,如果有一个变量`name=value`,那么`${!name}`将输出`value`。
- 变量扩展:可以使用`${var:-default}`来在变量未定义或为空时使用默认值。例如,如果变量`var`未定义,那么`${var:-default_value}`将输出`default_value`。
八、求 10 个随机数的最大值与最小值
#!/bin/bash
declare -a numbers
for ((i = 0; i < 10; i++)); do
numbers[$i]=$((RANDOM % 100))
done
echo "Generated numbers: ${numbers[@]}"
max=${numbers[0]}
min=${numbers[0]}
for num in "${numbers[@]}"; do
if [ $num -gt $max ]; then
max=$num
fi
if [ $num -lt $min ]; then
min=$num
fi
done
echo "Maximum number: $max"
echo "Minimum number: $min"
九、使用递归调用,完成阶乘算法实现
#!/bin/bash
factorial() {
local n=$1
if [ $n -eq 0 ]; then
return 1
else
local result=$((n * $(factorial $((n - 1)))))
return $result
fi
}
read -p "Enter a number: " num
result=$(factorial $num)
echo "Factorial of $num is $result"
```
十、解析进程和线程的区别?解析进程的结构
1. 进程和线程的区别:
- 定义:进程是程序的一次执行过程,它拥有自己的地址空间、内存、数据栈等资源。线程是进程中的一个执行单元,它共享进程的地址空间和资源,但有自己的程序计数器、栈和寄存器等。
- 资源占用:进程占用的资源比线程多,因为每个进程都有自己独立的地址空间和资源。线程共享进程的资源,因此创建和切换线程比进程更高效。
- 并发性:多个进程可以在同一时间并行执行,而多个线程可以在同一进程中并发执行。
- 通信方式:进程之间的通信通常需要使用进程间通信机制,如管道、消息队列、共享内存等。线程之间可以直接访问共享的内存和变量,通信更加方便。
2. 进程的结构:
- 进程控制块(PCB):包含了进程的状态信息、优先级、资源分配情况等。
- 代码段:存储程序的指令。
- 数据段:存储程序的数据。
- 堆:动态分配的内存区域。
- 栈:存储函数调用的栈帧和局部变量。
十一、结合进程管理命令,说明进程各种状态
在 Linux 中,可以使用`ps`命令查看进程状态。常见的进程状态有:
- `R`(Running):正在运行或可运行状态,表示进程正在 CPU 上执行或等待被调度执行。
- `S`(Sleeping):睡眠状态,表示进程在等待某个事件发生,如等待 I/O 操作完成、等待信号等。
- `D`(Disk Sleep):不可中断的睡眠状态,通常是在等待 I/O 操作完成,并且不能被信号中断。
- `Z`(Zombie):僵尸状态,表示进程已经结束,但它的父进程还没有回收它的资源。
- `T`(Stopped):停止状态,表示进程被暂停,通常是通过信号或调试器暂停的。
执行`ps aux`命令可以查看系统中所有进程的详细信息,包括进程状态。
十二、说明 IPC 通信和 RPC 通信实现的方式
1. IPC(Inter-Process Communication,进程间通信):
- 管道(Pipe):一种半双工的通信方式,只能在有亲缘关系的进程之间使用。
- 命名管道(Named Pipe):可以在无亲缘关系的进程之间使用,它在文件系统中有一个名称。
- 消息队列(Message Queue):是一种消息的链表,进程可以向消息队列中发送消息,也可以从消息队列中接收消息。
- 共享内存(Shared Memory):多个进程可以共享一块内存区域,从而实现快速的数据交换。
- 信号量(Semaphore):用于协调多个进程对共享资源的访问,防止出现竞争条件。
2. RPC(Remote Procedure Call,远程过程调用):
- RPC 框架通常提供了一种机制,使得一个进程可以调用另一个进程中的函数,就像调用本地函数一样。常见的 RPC 框架有 gRPC、Thrift 等。
- RPC 实现的方式通常包括以下几个步骤:
- 定义远程过程的接口和参数。
- 在客户端和服务器端分别实现这些接口。
- 使用 RPC 框架将客户端的请求发送到服务器端,并接收服务器端的响应。
十三、总结 Linux 前台和后台作业的区别,并说明如何在前台和后台中进行状态转换
1. 前台和后台作业的区别:
- 前台作业:在前台运行的作业会占用终端,用户可以直接与作业进行交互。例如,执行一个命令并等待其输出。
- 后台作业:在后台运行的作业不会占用终端,用户可以继续在终端上执行其他命令。后台作业通常在命令后面加上`&`符号来启动。
2. 状态转换:
- 将前台作业切换到后台:可以使用`Ctrl+Z`暂停前台作业,然后使用`bg`命令将其切换到后台运行。
- 将后台作业切换到前台:使用`fg`命令可以将后台作业切换到前台运行。
十四、实现定时任务,每日凌晨 1 点,删除指定文件
可以使用`crontab`来设置定时任务。以下是设置每日凌晨 1 点删除指定文件的步骤:
1. 打开终端,输入`crontab -e`编辑 crontab 文件。
2. 在文件中添加一行:`0 1 * * * rm /root/abc.txt`,其中`/root/abc.txt`是要删除的文件的路径。
3. 保存并退出文件。
这样,系统就会在每天凌晨 1 点自动删除指定文件。
十五、实现定时任务每月月初对指定文件进行压缩*
1. 打开终端,输入`crontab -e`编辑 crontab 文件。
2. 在文件中添加一行:`0 0 1 * * tar -czf /root/abc.tar.gz
这样,系统就会在每月月初自动对指定文件进行压缩。