第一题 编程题
1.使用函数重写,可以让用户选择当前主机的所有网卡。
2.选中网卡后,获取ip,网段,掩码。
3.通过ping命令检测在线的主机,打印在线的主机,写入一个文件中。
4.当ip的结尾是奇数时,在目标主机或当前主机,批量添加user1到user100用户,否则添加group1到group100,并生成对应的用户user1到user100,让用户的过期时间在1天之后。
5.要求每个小功能均封装为函数,有详细的错误处理,确保任何条件均可以正常执行完脚本,可以重复执行。
可能会使用while循环
#!/bin/bash
#
# fileName: worker.sh
# author: liAng
# mail: angl6112@163.com
# created: Tue 10 Jan 2023 10:07:53 PM CST
#
### BEGIN INIT INFO
# Description:
# 1.选择网卡
# 2.打印ip,网段,掩码
# 3.通过ping命令检测在线的主机,打印在线的主机,写入ip.list中
# 4.当ip的结尾是奇数时,在目标主机或当前主机,批量添加user1到user100用户,否则添加group1到group100,并生成对应的用户user1到user100,让用户的过期时间在1天之后
### END INIT INFO
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
SKYBLUE='\033[0;36m'
PLAIN='\033[0m'
#明天的日期
tomorrow=$(date -d '+1 day' +%F)
ip_file="ip.list"
> $ip_file
function select_netcard(){
netcard_list=$(ip a | grep -E '^[0-9]{1,3}' | cut -d'<' -f1 | sed -E 's/(.*):/\1/')
cat <<EOF
网卡列表:
$netcard_list
EOF
read -p '请输入网卡编号: ' netcard_num
echo
netcard=$(ip a |grep "^$netcard_num:" |sed -E "s/^$netcard_num: (.*): <.*/\1/")
}
function print_netinfo() {
# iP
#ipaddr=$(ifconfig $netcard | sed -n '/^\s*inet /p' | sed -E 's/.*inet ([0-9]{3}.*)\s+ netmask.*/\1/')
ipaddr=$(ip -4 a show $netcard | grep '\s*inet ' |sed -E 's#\s*inet (.*)/.*#\1#')
# 掩码
netmask=$(ifconfig $netcard | grep "inet $ipaddr" | sed -E 's/.* netmask ([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .*/\1/')
# 掩码长度
prefix=$(ip -4 a show $netcard | grep "\s*inet $ipaddr/" |sed -E 's/.*\/(.*) brd .*/\1/')
# 网段, 假设24位网段
network=$(sed -E 's/(.*\.)[0-9]{1,3}/\10/' <<<$ipaddr)
cat <<EOF
$netcard的网络信息:
ip地址: $ipaddr
子网掩码: $netmask
网段: $network/$netmask
EOF
}
function ping_scan() {
# ping网段内的所有ip
echo -e "$GREEN正在检测在线主机...$PLAIN"
for n in {1..3} # {1..254}
do
ip="$(sed -E 's/^(.*\.)[0-9]{1,3}$/\1/' <<<$network)$n"
ping -c 3 $ip &>/dev/null
if [ $? -eq 0 ];then
echo -e "$YELLOW$ip$PLAIN" | tee -a $ip_file
fi
done
}
function add_user() {
#while read ip;
#do
# echo $ip
#done <$ip_file
echo -e "$GREEN正在添加账户...$PLAIN"
# 添加账户, 改为检查本机的IP类型, 添加本机账户
n=$(sed -E 's/.*\.([0-9]{1,3}$)/\1/' <<<$ipaddr)
let "res=$n & 1"
echo -e "$GREEN开始添加账户, 请稍后...$PLAIN"
if [ "$res" -eq 1 ];then
# 奇数
echo user{1..10}|xargs -n1 useradd
else
# 偶数
echo group{1..10} | xargs -n1 groupadd
# 添加账户,指定主要组,并设置明天过期
seq 10 | xargs -i useradd -g group{} -e $tomorrow user{}
fi
}
function main() {
select_netcard
print_netinfo
ping_scan
add_user
}
main
第二题 总结TCP/IP 三次握手,4次断开原理,重点是出现状态代表什么含义,需要画图
三次握手:
tcp连接是双向的, 客户端建立到服务端的连接, 服务端也需要建立到客户端的连接。
①客户端发送SYN=1, seq=x 的数据包请求建立tcp连接,然后客户端进入 SYN_SEND状态等待服务端的ack确认; seq用来在发送方标识这个数据包
②服务端收到SYN的数据包后, 回复ACK=1的数据包表示同意建立 “客户端--->服务端” tcp连接, 同时将SYN为也置为1表示也要和客户端建立tcp连接; 这个数据包中的seq=y在服务端标识这个数据包, 同时ack=(x+1) 表示 “告诉客户端 seq=x的数据包我已经收到, 下次发seq=(x+1)的数据包 ” ; 并进入SYN_RECVD状态, 等待客户端回复ack
③客户端接收到服务端 ACK SYN报文后, 回复ACK=1的报文, 表示同意建立 “服务端--->客户端的tcp连接” , 同时回复数据包的seq=x+1是上次服务端要求的数据包, ack=y+1表示服务端发送的seq=y的数据包我已收到, 下次发送seq=y+1的包给我。客户端进入ESTABLISHED状态, 服务端在收到客户端回复的ACK后也进入ESTABLISHED状态, 至此TCP连接建立完成。
四次挥手:
第三题 总结OSI 7层模型及对应的协议,需要画图
第四题 搭建Yum/apt私服
4.1 配置服务端, 安装httpd服务
服务端配置:
# 1.安装httpd
yum -y install httpd
# 2.启动httpd服务
systemctl enable --now httpd
# 3.创建数据目录
mkdir /var/www/html/centos/8 -pv
使用浏览器打开IP地址检查下httpd是否运行正常
4.2 搭建yum仓库
例一、使用光盘镜像创建yum仓库
# 准备rpm包, rpm可以使用本地光盘镜像直接挂载镜像复制即可; 也可以使用网络yum源中的, 但是需要手动拉取。
# 使用光盘镜像
mount /dev/sr0 /mnt/
cp -a /mnt/* /var/www/html/centos/8
检查下文件内容:
例二、同步公网yum源
# 同步公网yum 源
# 需要在服务端先配置好公网yum源, 开始同步extras仓库, 同步其他仓库更改名称即可。
dnf reposync --repoid=extras --download-metadata -p /var/www/html/centos
--repoid: 指定要同步的yum 仓库; 这里测试使用同步的extras仓库
注意: 如果没有使用 --download-metadata 参数,则不会同步repodata, 这时候需要手动生成repodata。
Package目录中存放安装的rpm包, repodata中存放元数据文件这里面保存了rpm包的依赖关系, 当客户端使用yum或dnf安装rpm包时, 会自动下载repodata的元数据, 在其中查询软件包的依赖关系, 自动从Package目录中找到相关包下载安装。
4.3 配置客户端使用本地yum仓库
在客户端上添加repo配置, 指向搭建的yum服务器
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak/
yum clean all
# 例一、使用本地镜像的yum仓库配置
cat >/etc/yum.repos.d/local.repo<<EOF
[BaseOS]
name=BaseOS
#url写repodata所在的目录
baseurl=http://192.168.0.201/centos/8/BaseOS
#关闭包校验
gpgcheck=0
[AppStream]
name=Appstream
#url写repodata所在的目录
baseurl=http://192.168.0.201/centos/8/AppStream/
#关闭包校验
gpgcheck=0
EOF
# 例二、同步公网yum源的yum仓库配置
cat >/etc/yum.repos.d/local-extras.repo<<EOF
[extras]
name=extras
#url写repodata所在的目录
baseurl=http://192.168.0.201/centos/extras
#关闭包校验
gpgcheck=0
EOF
4.4 安装软件测试:
yum install cpaste -y