N77-Linux第三周作业
N77-Linux第三周作业
一、 yum私有仓库的实现及博客输出
-
关闭防火墙
[root@Rocky8 ~]# systemctl stop firewalld
-
安装http服务
[root@Rocky8 ~]# yum install httpd -y
-
开机自启动http服务
[root@Rocky8 ~]# systemctl enable --now httpd
-
安装epel源
[root@Rocky8 ~]# yum install epel-release -y [root@Rocky8 ~]# yum repolist repo id repo name appstream Rocky Linux 8 - AppStream baseos Rocky Linux 8 - BaseOS epel Extra Packages for Enterprise Linux 8 - x86_64 extras Rocky Linux 8 - Extras
-
下载epel仓库包和mata数据至/var/www/html
[root@Rocky8 ~]# yum reposync --repoid=epel --download-metadata -p /var/www/html
-
客户端测试
二、阅读《图解TCP/IP》一书,地址:https://leon-wtf.github.io/doc/图解TCPIP.pdf,有时间的可以写下读书笔记(选做)
三、画图 TCP协议和三次握手及四次挥手,可以参考别人的,但是需要自己画一次
3.1 三次握手
所谓的三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
Note left of 客户端: CLOSED
Note right of 服务端: CLOSED
客户端->服务端: SYN=1,seq=x
Note right of 服务端: LISTEN
服务端->客户端:SYN=1,ACK=1,seq=y,ack=x+1
Note left of 客户端: SYN-SENT
客户端->服务端:ACK=1,seq=x+1,ack=y+1
Note right of 服务端: SYN-RCVD
Note left of 客户端: ESTABLISHED
Note right of 服务端: ESTABLISHED
-
第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
-
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
-
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
3.2 四次挥手
TCP的断开连接需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
Note left of 客户端: ESTABLISHED
Note right of 服务端: ESTABLISHED
客户端->服务端: FIN=1,seq=u
Note right of 服务端: CLOSE-WAIT
服务端->客户端:ACK=1,seq=v,ack=u+1 (数据传输)
Note left of 客户端: FIN-WAIT-1
Note right of 服务端: CLOSE-WAIT
服务端->客户端:FIN=1,ACK=1,seq=w,ack=u+1
Note left of 客户端: FIN-WAIT-2
客户端->服务端:ACK=1,seq=u+1,ack=w+1
Note right of 服务端: LAST-ACK
Note left of 客户端: TIME-WAIT
Note right of 服务端: CLOSED
Note left of 客户端: CLOSED
- 第一次挥手:客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,终止标志位FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
- 第二次挥手:服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 第三次挥手: 客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
- 第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态,至此,完成四次挥手。
四、静态配置网卡IP,centos/ubuntu实现
4.1 centos8/ubuntu18.4实现网络基本配置
4.1.1 网络配置方式
-
静态指定:
- ifconfig, route, netstat
- ip: object {link, addr, route}, ss, tc
system-config-network-tui,setup
配置文件
-
动态分配:
DHCP: Dynamic Host Configuration Protocol
4.1.2 centos网络基本配置
4.1.2.1 IP、MASK、GW、DNS相关的配置文件
- 文件路径
/etc/sysconfig/network-scripts/ifcfg-ens160
- 文件参数说明
TYPE 接口类型;常见有的Ethernet, Bridge
NAME 此配置文件应用到的设备
DEVICE 设备名
HWADDR 对应的设备的MAC地址
UUID 设备的惟一标识
BOOTPROTO 激活此设备时使用的地址配置协议,常用的dhcp, static, none, bootp
IPADDR 指明IP地址
NETMASK 子网掩码,如:255.255.255.0
PREFIX 网络ID的位数, 如:24
GATEWAY 默认网关
DNS1 第一个DNS服务器地址
DNS2 第二个DNS服务器地址
DOMAIN 主机不完整时,自动搜索的域名后缀
ONBOOT 在系统引导时是否激活此设备
USERCTL 普通用户是否可控制此设备
PEERDNS
如果BOOTPROTO的值为“dhcp”,YES将允许dhcp server分配的dns服务
器信息直接覆盖至/etc/resolv.conf文件,NO不允许修改resolv.conf
- 配置IP:192.168.10.128/24、网关:192.168.10.255、DNS:114.114.114.114
[root@Rocky8 ~]#vim /etc/sysconfig/network-scripts/ifcfg-ens160
[root@Rocky8 ~]#cat /etc/sysconfig/network-scripts/ifcfg-ens160
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.10.128
PREFIX=24
GATEWAY=192.168.10.255
DNS1=114.114.114.114
[root@Rocky8 ~]# nmcli con reload && nmcli con up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@Rocky8 ~]# hostname -I
192.168.10.128
- 验证配置是否成功
[root@Rocky8 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:d7:87:c7 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.10.128/24 brd 192.168.10.255 scope global dynamic noprefixroute ens160
valid_lft 1632sec preferred_lft 1632sec
inet6 fe80::20c:29ff:fed7:87c7/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@Rocky8 ~]# ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=11 ttl=128 time=41.9 ms
64 bytes from 114.114.114.114: icmp_seq=53 ttl=128 time=144 ms
64 bytes from 114.114.114.114: icmp_seq=54 ttl=128 time=144 ms
#验证DNS
[root@Rocky8 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search localdomain 5.localdomain
nameserver 114.114.114.114
4.1.3 Ubuntu网络配置
- 说明
Ubuntu18版本之后网卡配置文件采用YAML格式,必须以/etc/netplan/XXX.yaml
文件命名方式存放可以每个网卡对应一个单独的配置文件,也可以将所有网卡都放在一个配置文件里
yaml文件格式:列表和键值对两种,并包含从属关系,严格控制缩进区分
- 网络配置文件
root@ubuntu2004:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
ens33: #网卡名
addresses: [192.168.10.129/24] #静态IP地址
dhcp4: no #取消ipv4的dhcp
optional: true
gateway4: 192.168.10.255 #网关地址
nameservers:
addresses: [114.114.114.114] #DNS地址,多个用逗号分隔
version: 2
renderer: networkd
- 修改网卡配置文件后需执行命令生效:
root@ubuntu2004:~# netplan apply
- 验证配置结果是否生效
root@ubuntu2004:~# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.129 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fed4:77bc prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d4:77:bc txqueuelen 1000 (Ethernet)
RX packets 866 bytes 278559 (278.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 617 bytes 65932 (65.9 KB)
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 100 bytes 7868 (7.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 100 bytes 7868 (7.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
五、脚本题
实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆。
1)通过shift读取脚本参数
2)通过select来选择功能.例如功能有
-
安装mysql
-
安装apache
-
免密钥登陆主机
当前我们只实现免密钥登陆主机3)通过函数封装每个功能
4)将免密钥登陆的过程可以重复进行, while 循环实现重复,需要有退出过程。当用户输入exit时,退出免密钥功能。
5)支持输入一批主机免密钥,使用数组 实现
#!/bin/bash
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORRMAL="echo -en \033[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ];then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1"];then
${SETCOLOR_FAILURE}
echo -n $"FAILEO"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORRMAL}
echo -n "]"
echo
}
#免密登录,支持一批主机免密钥
ssh_login () {
NET=10.0.0
user=root
password=123456
IDLIST=({127..200})
for ID in ${IDLIST[*]};do
ip=$NET.$ID
read -p "是否登录$ip?(y登录 exit退出)" answer
[[ $answer == "y|Y" ]]&& ssh $user$ip
[[ $answer == "exit" ]] && break
expect <<EOF
set timeout 20
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect "]#" { send "exit\n"}
expect eof
EOF
done
}
#安装mysql
install_mysql () {
. /etc/os-release
if [ $ID = "rocky" -o $ID = "centos" ] ; then
yum -y install mysql
elif [ $ID = "ubuntu" ] ;then
apt -y install mysql
else
echo "OS is not support"
fi
color "mysql 已安装" 0
}
#安装apache
install_httpd () {
. /etc/os-release
if [ $ID = "rocky" -o $ID = "centos" ];then
yum -y install httpd
elif [ $ID = "ubuntu" ];then
apt -y install httpd
else
echo "OS is not support"
fi
color "httpd 已安装" 0
}
menu () {
PS3="请选择功能(1-4):"
select menu in install_mysql install_httpd ssh_login exit ;do
case $REPLY in
1)install_mysql
;;
2)install_httpd
;;
3)ssh_login
;;
4)exit
;;
*)echo "请重新输入"
;;
esac
done
}
menu
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程