第三周作业

发布时间 2023-10-23 16:32:27作者: 一只花狗-

1. 尝试基于gcc命令说明 c语言编译过程。

# 编写hello.c脚本, 输出 "Hello,world"
[root@localhost ]# cat hello.c
#include <stdio.h>

int main(void)
{
    printf("Hello,world\n");
}

# 预处理:对hello.c文件进行预处理,生成hello.i文件
[root@localhost ]# gcc -E hello.c -o hello.i
# 这时候的hello.i文件会多了很多预处理信息内容
[root@localhost ]# wc -l hello.i
720 hello.i

# 编译:对预处理文件进行编译,生成汇编文件
[root@localhost ]# gcc -S hello.i -o hello.s
# 这时候已经将c语言编译成汇编语言
[root@localhost ]# cat hello.s 
	.file	"hello.c"
	.text
	.section	.rodata
.LC0:
	.string	"Hello,world"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$.LC0, %edi
	call	puts
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-18)"
	.section	.note.GNU-stack,"",@progbits

# 汇编:对汇编文件进行编译,生成目标文件hello.o
[root@localhost ]# gcc -c hello.s -o hello.o
# 这时候hello.o是一个二进制文件
[root@localhost ]# file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

# 链接:对目标文件进行连接,生成最终的可执行文件
[root@localhost ]# gcc hello.o -o hello
[root@localhost ]# ls
hello  hello.c  hello.i  hello.o  hello.s
[root@localhost ]# ./hello 
Hello,world

2. 总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取? yum/dnf/apt

(1)程序包管理器有yum、dnf、apt

(2)软件包种一般包含如下文件:
	- 二进制文件
	- 库文件
	- 配置文件
	- 帮助文件
	
(3)cpio工具可以查看包文件列表
	语法:
		rpm2cpio 包文件 | cpio -itv 预览包内文件
	例子:
		[root@localhost ]# rpm2cpio mysql-community-client-8.0.34-1.el8.x86_64.rpm | cpio -itv | head -5
        161240 blocks
        -rwxr-xr-x   1 root     root      7717920 Jun 22 20:36 ./usr/bin/mysql
        -rwxr-xr-x   1 root     root      6520456 Jun 22 20:36 ./usr/bin/mysql_config_editor
        -rwxr-xr-x   1 root     root      7492320 Jun 22 20:36 ./usr/bin/mysql_migrate_keyring
        -rwxr-xr-x   1 root     root      7403624 Jun 22 20:36 ./usr/bin/mysqladmin
        -rwxr-xr-x   1 root     root      7874248 Jun 22 20:36 ./usr/bin/mysqlbinlog

3. 总结程序包获取途径,以及rpm, yum, apt命令选项示例。

# 示例

# rpm 包获取路径
	- 访问centos官网镜像源 http://mirror.centos.org/centos/7
    - 用rpm下载对应软件包
    	rpm -ivh http://mirror.centos.org/centos/7/updates/x86_64/Packages/httpd-2.4.6-97.el7.centos.1.x86_64.rpm
 
# yum 获取, 只获取,不安装
	- yumdownloader http://mirror.centos.org/centos/7/updates/x86_64/Packages/httpd-2.4.6-97.el7.centos.1.x86_64.rpm
	
	
# apt 获取
	- 访问地址:http://cdimage.ubuntu.com/releases
	- apt 获取
		[root@localhost ]# apt install https://mirrors.aliyun.com/ubuntu/pool/main/a/apache2/apache2_2.4.57-2ubuntu2_amd64.deb?spm=a2c6h.25603864.0.0.5e4839ce7pKtPr

4. 简要总结yum/dnf工作原理。并搭建私有yum仓库(base, epel源)给另一个虚拟机使用。

(1)工作原理
	​	服务器:yum repolistory(仓库)--> rpm包、元数据(存在repodata目录)
	​	客户端:yum工具-->从repodata拉去元数据-->下载并安装相关包、包依赖、
	
(2)私有仓库
	# base源
	# 服务器配置
	yum -y install httpd
	systemctl enable --now httpd
	mkdir -pv /var/www/html/centos/8
	mount /dev/sr0 /mnt/
	cp -a /mnt/* /var/www/html/centos/8
	
	# 客户端配置
	cat /etc/yum.repos.d/local.repo
	[BaseOS]
	name=BaseOS
	baseurl=http://1.1.1.1/centos/8/BaseOS
	gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
	
	
	#epel源
	# 服务器配置
	[root@localhost ]# cat /etc/yum.repos.d/base.repo
	[epel]
	name=EPEL
	baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
	gpgcheck=0
	[root@localhost ]# dnf repolist
	[root@localhost ]# dnf reposync --repoid=epel --download-metadata -p /var/www/html
	[root@localhost ]# wget -P /var/www/html/epel
	[root@localhost ]# systemctl start httpd
	
	# 客户端配置
	[root@localhost ]# cat /etc/yum.repos.d/local.repo
	[epel]
	name=EPEL
	baseurl=http://1.1.1.1/8/epel/
	gpgkey=http://1.1.1.1/epel/RPM-GPG-KEY-EPEL-8
	[root@localhost ]# yum repolist

5. 总结系统安装之后的常用初始化步骤。rocky/ubuntu

# Rocky
	sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
	systemctl disable --now firewalld
	yum -y install epel-release
	yum install -y bash-completion wget libGL autoconf automake libtool curl make g++ glibc-headers lsof gcc-c++ unzip zip cmake screen net-tools vim lrzsz htop gdb rsync psmisc sshpass
	
# Ubuntu
	- 设置root密码
		sudo -i
		passwd root
	- 允许root登录
		grep ^PermitRootLogin /etc/ssh/sshd_config
	- 更新软件
		apt update
		apt upgrade
	- 安装基础软件
		apt install bash-completion wget libGL autoconf automake libtool curl make g++ glibc-headers lsof gcc-c++ unzip zip cmake screen net-tools vim lrzsz htop gdb rsync psmisc sshpass

6. 解读一键安装httpd脚本,并自行实现一个一键安装脚本,要求

1)基于位置变量传递版本号

2)基于独立函数进行初始化步骤,禁用防火墙,安装开发依赖包。

3)基于独立函数进行下载包,解压包。

4)基于独立函数进行编译,安装包。

5)基于独立函数完成链接包。

6)启动服务,并输出自定义的语句,安装xxx服务

[root@localhost ]# cat httpd_install.sh
#!/bin/bash

# httpd软件依赖
httpd_dep="apr-devel apr-util-devel gcc pcre-devel openssl-devel make redhat-rpm-config autoconf"
httpd_path=/opt/httpd
httpd_sys_path=/etc/httpd

if [ $# -ne 1 ]
then
    echo "请输入软件版本号,如 2.4.58"
    exit 1
fi

num=$1

# 初始化
base_install(){
    sed -i '/^SELINUX=/c SELINUX=disbaled' /etc/selinux/config || echo "Failed to disable firewalld"
    systemctl disable --now firewalld || echo "Failed to disable firewalld"
    yum -y install $(eval echo $httpd_dep) || echo "Failed to install softwwares"
}

# 下载解压
wget_unzip(){
    wget -c http://archive.apache.org/dist/httpd/httpd-${num}.tar.gz
    gzip -d httpd-${num}.tar.gz
    tar xvf httpd-${num}.tar
}

# 编译安装
make_install(){
    cd httpd-${num}
    ./configure --prefix=${httpd_path} --sysconfdir=${httpd_sys_path} --enable-ssl
    make || echo "Failed to make"
    make install || echo "Failed to make install"
}

# 链接
link_http(){
    echo "PATH=${httpd_path}/bin:$PATH" > /etc/profile.d/httpd.sh
    source /etc/profile.d/httpd.sh
}

# httpd启动配置
httpd_start(){ 
    sed -i '/#ServerName/c ServerName www.example.com:80' ${httpd_sys_path}/httpd.conf
    apachectl start && echo "安装httpd-${num}服务成功"  || echo "安装httpd-${num}服务失败"
}
# 主函数
start_main(){
    base_install
#   wget_unzip
    make_install
    link_http
    httpd_start
}

# 启动
start_main


7. 总结开放系统互联OSI模型,每层作用及对应的协议。

OSI模型分七层:		对应作用								对应协议
7	应用层			针对特定应用的协议						电子邮件协议SMTP、远程登录协议telnet、文件传输ftp协议
6	表示层			设备固有数据格式和网络标准数据格式的转换	 ASCII、EBCDIC、Unicode、JPEG、GIF等	
5	会话层			为会话实体间建立连接						RPC,SQL,NFS,NetBIOS,names,AppleTalk
4	传输层			提供了主机应用程序进程之间的端到端的服务      TCP/UDP
3	网络层			提供数据通信								IP协议、地址解析协议
2	数据链路层	   是向该层用户提供透明的和可靠的数据传送基本服务  异步协议、同步协议
1	物理层			数据端设备提供传送数据通路、传输数据			DSL、usb

8. 调整动态端口范围为20000-60000

[root@localhost ]# cat /proc/sys/net/ipv4/ip_local_port_range
32768	60999

[root@localhost ]# echo 20000 60000 > /proc/sys/net/ipv4/ip_local_port_range
[root@localhost ]# cat /proc/sys/net/ipv4/ip_local_port_range
20000	60000

9. 总结TCP包头结构,TCP三次握手,4次挥手。

TCP包头结构由源端口、目的端口、序号、确认号、数据偏移、保留、URG、ACK、PSH、RST、SYN、FIN、窗口、校验和、紧急指针、选项、填充组成。

TCP三次握手

​ 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
​ 第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
​ 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

TCP四次握手

​ 第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
​ 第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
​ 第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
​ 第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。

10.总结主机到主机的包传递过程。

1. 数据封装:发送方将要传输的数据划分为较小的数据块,称为数据包。每个数据包通常包含数据本身以及一些元数据,如源地址、目标地址、序列号等。

2. 路由选择:发送方通过路由选择算法确定数据包的下一跳路径。路由选择算法可以基于不同的策略,如最短路径、最快路径等。

3. 数据包传输:发送方根据路由选择的结果将数据包发送到下一跳的网络节点。这个过程通常涉及网络层和数据链路层的协议,例如IP协议和以太网协议。

4. 中转与转发:数据包在网络中的每个中间节点(路由器、交换机等)都会接收、处理和转发数据包。中间节点负责根据目标地址决定下一跳的路径,并进行转发。

5. 到达目标主机:经过多次中转后,数据包最终到达目标主机。目标主机接收数据包,并根据数据包的目标地址进行处理。

6. 解封装:目标主机根据协议栈的顺序逐层解封装数据包。这意味着目标主机会逐层剥去数据包的封装,直到获得原始的数据。

7. 数据处理:目标主机接收到数据后,根据应用层协议解析数据,并进行相应的处理。这可能包括数据的存储、显示、响应等操作。

总的来说,一个数据包的完整传输过程涉及数据封装、路由选择、数据包传输、中转与转发、到达目标主机、解封装和数据处理等步骤。这个过程是网络通信中的基本流程,确保数据能够从发送方传输到目标主机并得到正确处理。

11. 总结IP地址 A, B, C, D 类,并解析IP地址的组成

A类:	A类IP地址就由1字节的网络地址和3字节主机地址组成
	网络数:126=2^7
	主机数:2^24-2=16777214
	默认子网掩码:255.0.0.0
	私网地址:10.0.0.0

B类:	B类IP地址就由2字节的网络地址和2字节主机地址组成
	网络数:2^14=16384
	主机数:2^16-2=65534
	默认子网掩码:255.255.0.0
	私网地址:172.16.0.0-172.31.0.0
	
C类:	C类IP地址就由3字节的网络地址和1字节主机地址组成
	网络数:2^21=2097152
	主机数:2^8-2=254
	默认子网掩码:255.255.255.0
	私网地址:192.168.0.0-192.168.255.0
	
D类:	D类IP地址在历史上被叫做多播地址(multicast address),即组播地址
	组(多)播

12. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。

[root@localhost ]# nmcli con mod eth0 ip4v.addresses "192.168.1.10/24" \
ipv4.gateway "192.168.1.1" ipv4.dns "8.8.8.8" ipv4.method manual

[root@localhost ]# nmcli con add con-name eth0 ifname eth0 type ethernet autoconnect yes

[root@localhost ]# nmcli con up  eth0

13. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。

[root@localhost ]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp					# 激活此设备时使用的地址配置协议,常用的有dhcp、static、none
DEVICE=eth0						# 设备名
HWADDR=00:16:3c:51:9a:9e		# MAC地址							# 
NM_CONTROLLED=yes				# 网卡是否接受NM控制(NM--NetworkManager)
ONBOOT=yes						# 在系统引导时是否激活此设备
TYPE=Ethernet					# 接口类型
USERCTL=no						# 普通用户是否可控制此设备

14. 基于配置文件或命令完成bond0配置

[root@localhost ]# nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup \
ipv4.method manual ipv4.addresses 10.0.0.100/24
[root@localhost ]# nmcli con add type bond-slave ifname ens7 master bond0
[root@localhost ]# nmcli con add type bond-slave ifname ens3 master bond0
[root@localhost ]# nmcli con up bond-slave-ent0
[root@localhost ]# nmcli con up bond-slave-eth1
[root@localhost ]# nmcli con up mybond0

15. 通过ifconfig命令结果找到ip地址.

[root@localhost ]# ifconfig  eth0 | awk 'NR==2{print $2}'

16. 使用脚本判断你主机所在网络内在线的主机IP有哪些? ping通则在线。

[root@localhost ]# cat ping.sh
#!/bin/bash

for i in $(seq 1 254)
do
    for j in $i
    do  
        {
            ip=192.168.0.$j
            ping -c1 -W1 $ip &> /dev/null && echo "$ip is up" || ( echo "$ip is unreachable" ; exit )
        }&
    done
done
wait

17. 使用while read line和/etc/passwd,计算用户id总和。

[root@localhost ]# cat uids.sh
sum=0
awk -F: '{print $3}' /etc/passwd | while read line
do
    let sum+=line
    echo $sum
done | tail -1