第三周:软件管理第&网络基础&网络基础&网络高级配置&shell脚本进阶

这篇博客详细介绍了Linux系统的网络配置,包括IP、子网掩码、网关、DNS的设置,以及网络配置命令如`ifconfig`。同时,讲解了软件包管理器yum/dnf的工作原理和命令用法,包括程序包获取途径和命令选项示例。此外,还涉及到TCP/IP协议的基础知识,如TCP包头结构、三次握手和四次挥手过程。
摘要由CSDN通过智能技术生成
1. 尝试基于gcc命令说明 c语言编译过程。

#分步骤编译运行

gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i 文件

gcc -S hello.i -o hello.s 对预处理文件进行编译,生成了汇编文件

gcc -c hello.s -o hello.o 对汇编文件进行编译,生成了目标文件

gcc hello.o -o hello 对目标文件进行链接,生成可执行文件

#一步实现编译过程

gcc hello.c -o hello 直接编译链接成可执行目标文件

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

主流的程序包管理器

redhat:rpm文件, rpm 包管理器,rpm:Redhat Package Manager,RPM Package Manager

debian:deb文件, dpkg 包管理器

软件包中的文件分类

  • 二进制文件

  • 库文件

  • 配置文件

  • 帮助文件

范例:利用 cpio工具查看包文件列表

rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id  "*.conf" 释放包内文件
  1. 使用 Yum 获取文件的方法:

要安装包的命令: yum install packagename

要查找包的命令:yum search packagename

要更新包的命令:yum update packagename

  1. CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的。

  1. 使用 Apt 获取文件的方法:

要安装包的命令:sudo apt install packagename

要查找包的命令:sudo apt search packagename

要更新包的命令:sudo apt update && sudo apt upgrade

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

程序包获取途径

  • 系统发版的光盘或官方网站

  • 第三方组织提供

  • 软件项目官方站点

  • 搜索引擎

  • 自己制作

yum命令的用法:yum [options] [command] [package ...]

yum的命令行选项:

-y #自动回答为"yes"
-q #静默模式
--nogpgcheck #禁止进行gpg check
--enablerepo=repoidglob    #临时启用此处指定的repo,支持通配符,如:"*"
--disablerepo=repoidglob #临时禁用此处指定的repo,和上面语句同时使用,放在后面的生效

显示仓库列表:yum repolist [all|enabled|disabled]

清除目录/var/cache/yum/缓存:yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:yum makecache

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

yum/dnf 是基于C/S 模式

yum 服务器存放rpm包和相关包的元数据库;yum 客户端访问yum服务器进行安装或查询等

yum 实现过程

先在yum服务器上创建 yum repository(仓库),在仓库中事先存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下),当yum客户端利用yum/dnf工具进行安装时包时,会自动下载repodata中的元数据,查询远数据是否存在相关的包及依赖关系,自动从仓库中找到相关包下载并安装。

搭建私有仓库

必须的仓库

1、系统仓库

CentOS8 :BaseOS APPStream CentOS7: Baseos

2 EPEL仓库

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

rocky/centos基本的初始化操作

最小化安装  

关闭防火墙  systemctl disable --now firewalld   

关闭SELinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

支持自动挂载光盘,/misc/cd对应就是光盘内容
yum -y install autofs
systemctl enable --now autofs

实现邮件通信
 yum -y install postfix mailxvi
 systemctl enable --now postfix

yum 源
1、系统仓库
CentOS8 :BaseOS APPStream  CentOS7; Baseos
2 EPEL仓库

最小化安装系统后,建议安装常用软件
yum -y install autofs vim-enhanced tcpdump autofs chrony lrzsz tree telnet ftp lftp redhat-lsb-core bash-completion net-tools postfix wget bzip2 zip unzip xz lsof mlocate man-pages rsync  psmisc  vim

修改网卡名称
[root@rocky8 ~]#sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub
[root@rocky8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg  #为grub2生成其配置文件
[root@rocky8 ~]#reboot

时间同步

修改limits.conf文件

ubuntu的初始化设置

#修改网卡名称为传统命名方式: 
(默认ubuntu的网卡名称和 CentOS 7 类似,如:ens33,ens38等
(1)#修改配置文件为下面形式 
root@ubuntu1804:~#vi /etc/default/grub 
GRUB_CMDLINE_LINUX="net.ifnames=0" 
#或者sed修改    root@ubuntu1804:~# sed -i.bak '/^GRUB_CMDLINE_LINUX=/s#"$#net.ifnames=0"#' /etc/default/grub
(2)#生效新的grub.cfg文件    
root@ubuntu1804:~# grub-mkconfig -o /boot/grub/grub.cfg 
#或者 
root@ubuntu1804:~# update-grub 
root@ubuntu1804:~# grep net.ifnames /boot/grub/grub.cfg 
       linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a-8c14- 
fe1a48ba153c ro net.ifnames=0 
       linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a- 
8c14-fe1a48ba153c ro net.ifnames=0 
       linux /vmlinuz-4.15.0-96-generic root=UUID=51517b88-7e2b-4d4a- 
8c14-fe1a48ba153c ro recovery nomodeset net.ifnames=0 
       linux /vmlinuz-4.15.0-76-generic root=UUID=51517b88-7e2b-4d4a- 
8c14-fe1a48ba153c ro net.ifnames=0 
       linux /vmlinuz-4.15.0-76-generic root=UUID=51517b88-7e2b-4d4a- 
8c14-fe1a48ba153c ro recovery nomodeset net.ifnames=0 
 (3)#重启生效 :root@ubuntu1804:~# reboot 

#网卡IP配置
Ubuntu  #配置文件注意缩进,同一级的缩进要一致,一般缩进两个; #冒号后面有空格
(1)配置自动获取IP 
网卡配置文件采用YAML格式,必须以 /etc/netplan/XXX.yaml 文件命名方式存放可以每个网卡对应一个单独的配置文件,也可以将所有网卡都放在一个配置文件里 
root@ubuntu1804:~# cat /etc/netplan/01-netcfg.yaml 
# This file describes the network interfaces available on your system 
# For more information, see netplan(5). 
network: 
     version: 2 
     renderer: networkd 
     ethernets: 
         eth0: 
             dhcp4: yes
修改网卡配置文件后需执行命令生效:root@ubuntu1804:~#netplan apply

(2)配置静态IP 
root@ubuntu1804:~#vim /etc/netplan/01-netcfg.yaml 
network: 
     version: 2 
     renderer: networkd 
     ethernets: 
         eth0: 
             addresses: [192.168.8.10/24,10.0.0.10/8]  #或者用下面两行,两种格式不能混用 
             - 192.168.8.10/24                                          # - 这个横线可以缩进,也可以与address平级,且横线后面有空格
             - 10.0.0.10/8 
             gateway4: 10.0.0.2 
             nameservers: 
                  search: [magedu.com, magedu.org] 
                  addresses: [180.76.76.76, 8.8.8.8, 1.1.1.1]
修改网卡配置文件后需执行命令生效:root@ubuntu1804:~#netplan apply
 

关闭防火墙和SElinux,ubuntu默认是关闭的

时区timedatectl set-timezone Asia/Shanghai

apt install

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

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

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

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

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

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

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

脚本解读:

脚本中的. /etc/os-release

查看 cat /etc/os-release,包含id信息ID="rocky",. /etc/os-release可以使得这些操作系统信息可以在Shell脚本中被使用,所以ID="rocky"在脚本中是一个变量了。

[root@localhost ~]# cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.7 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.7"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.7 (Green Obsidian)"
ANSI_COLOR="0;32"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:rocky:rocky:8:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky-Linux-8"
ROCKY_SUPPORT_PRODUCT_VERSION="8.7"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8.7"
#!/bin/bash   
#解释器为bash

CPUS=`grep -c  processor /proc/cpuinfo`  #grep命令统计CPU核心数,将结果赋值给变量CPUS。
HTTPD_VERSION=2.4.52
INSTALL_DIR=/apps/httpd  #指定安装目录
COLOR="echo -e  \E[32;1m"
END="\E[0m"

. /etc/os-release
#.命令会在当前Shell中执行引入的脚本,从而使得这些操作系统信息可以在Shell脚本中被使用。
在这脚本中,这行命令的作用是获取当前操作系统的信息,用于判断所需安装的软件包和服务。

if [ $ID = 'rocky' -o $ID = "centos" ];then
    systemctl disable --now firewalld
    yum -y install gcc make apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config bzip2
elif  [ $ID = 'ubuntu' ];then
    atp update
    apt -y  install  libapr*  libpcre3* libssl-dev make
else
    $COLOR"不支持此系统"$END
    exit
fi

cd /usr/local/src
rpm -q wget || yum -y install wget
wget https://dlcdn.apache.org//httpd/httpd-${HTTPD_VERSION}.tar.bz2  || { $COLOR "下载失败,退出" $END;exit ; }

tar xf httpd-${HTTPD_VERSION}.tar.bz2

cd httpd-${HTTPD_VERSION}

./configure --prefix=${INSTALL_DIR} --enable-ssl  --disable-status

make -j $CPUS && make install

ln -s /apps/httpd/bin/apachectl  /usr/local/bin/

apachectl start && $COLOR"安装成功!"$END
$COLOR"请访问:http://`hostname -I`"$END
7. 总结开放系统互联OSI模型,每层作用及对应的协议。

第7层 应用层

应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如: HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3、MySQL等

第6层 表示层

主条目:表示层(Presentation Layer)把数据转换为能与接收者的系统格式兼容并适合传输的格式

第5层 会话层

会话层(Session Layer)负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

第4层 传输层

传输层(Transport Layer)把传输表头(TH)加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。例如:传输控制协议(TCP)等。

第3层 网络层

网络层(Network Layer)决定数据的路径选择和转寄,将网络表头(NH)加至数据包,以形成报文。网络表头包含了网络数据。例如:互联网协议(IP)等。

第2层 数据链接层

数据链路层(Data Link Layer)负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成信息框(Data Frame)。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。分为两个子层:逻辑链路控制(logical link control,LLC)子层和介质访问控制(Media access control,MAC)子层

第1层 物理层

物理层(Physical Layer)在局部局域网上传送数据帧(Data Frame),它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、主机接口卡等

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

端口分类

传输层通过port号,确定应用层协议,范围0-65535

IANA互联网数字分配机构负责域名,数字资源,协议分配

0-1023:系统端口或特权端口(仅管理员可用) ,众所周知,永久的分配给固定的系统应用使用,22/tcp(ssh), 80/tcp(http), 443/tcp(https)

1024-49151:用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,1433/tcp(SqlServer), 1521/tcp(oracle),3306/tcp(mysql),11211/tcp/udp (memcached)

49152-65535:动态或私有端口,客户端随机使用端口,范围定义:/proc/sys/net/ipv4/ip_local_port_range

如何查看动态端口的范围:

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

[root@localhost ~]# echo 20000 62000 > /proc/sys/net/ipv4/ip_local_port_range

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range
20000    62000

 永久修改
[root@localhost ~]# echo "net.ipv4.ip_local_port_range = 20000 60000" >> /etc/sysctl.conf
9. 总结TCP包头结构,TCP三次握手,4次挥手。

TCP包头结构:

TCP包头共20字节,包含以下信息:

  • 源端口号(16位):指发送方的端口号;

  • 目的端口号(16位):指接收方的端口号;

  • 序号(32位):TCP连接的数据传输序列号;

  • 确认序号(32位):接收方已经成功收到的、具有累积效应的数据确认序号;

  • 数据偏移(4位):指TCP包头的长度;

  • 保留(6位):预留字段;

  • 标志位(6位):TCP连接状态标志;

  • 窗口大小(16位):窗口大小表示可以接受的字节长度;

  • 校验和(16位):用于错误检测,检测到数据传输过程中的错误;

  • 紧急指针(16位):用于指示紧急数据的末尾位置。

TCP三次握手:

刚开始客户端处于 closed 的状态,服务端处于 listen 状态。然后:

1、第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。

2、第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。

3、第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised 状态。

4、服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。

4次挥手:

刚开始双方都处于 establised 状态,假如是客户端先发起关闭请求,则:

1、第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。

2、第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。

3、第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

4、第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态

5、服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。

10. 总结主机到主机的包传递过程。
15. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。
16. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。

1)修改网卡名:

Centos7&8

使用传统命名方式:

(1) 编辑/etc/default/grub配置文件 GRUB_CMDLINE_LINUX=" .... net.ifnames=0 biosdevname=0"

(2) 为grub2生成其配置文件 grub2-mkconfig -o /etc/grub2.cfg

(3) 重启系统 reboot

2)#网卡IP配置

CentOS 7,8

[root@localhost ~]##cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

NAME=eth0

BOOTPROTO=static

IPADDR=10.0.0.8 #每个主机IP不同

PREFIX=24

GATEWAY=10.0.0.2

DNS1=10.0.0.2

DNS2=180.76.76.76

ONBOOT=yes

[root@localhost ~]#reboot (重启生效)

18. 通过ifconfig命令结果找到ip地址。
[root@localhost ~]# ifconfig  | awk 'NR==2{print $2}'
10.0.0.81

[root@localhost ~]# ifconfig eth0 | awk '/netmask/{print $2}'
10.0.0.81

[root@localhost ~]# ifconfig eth0|sed -n '2p' |awk '{print $2}'|cat -A
10.0.0.81$
19. 使用脚本判断 你主机所在网络内(10.0.0.0/24)在线的主机IP有哪些? ping通则在线。
[root@localhost ~]# cat ping_ip.sh 
#!/bin/bash
NET=10.0.0

for i in {1..254};do
    if ping -c1 -w1 $NET.$i &> /dev/null ;then
        echo $NET.$i is up | tee -a hosts.txt      #-a表示追加,不然会覆盖                                                                                     
    fi
done


#!/bin/bash
NET=10.0.0

for i in {1..254};do
    if ping -c1 -w1 $NET.$i &> /dev/null ;then
        echo $NET.$i is up | tee hosts.txt                                                                                           
    fi
done

[root@localhost ~]# cat hosts.txt 
10.0.0.1 is up
10.0.0.2 is up
10.0.0.71 is up
10.0.0.81 is up
20. 使用while read line和/etc/passwd,计算用户id总和。
[root@localhost data]# cat uid_sum.sh 
#!/bin/bash

total=0

while read line
do
  uid=$(echo $line | cut -d: -f3)
  total=$((total+uid))
done < /etc/passwd

echo "Total user ids: $total"

[root@localhost data]# chmod +x uid_sum.sh 
[root@localhost data]# bash uid_sum.sh 
Total user ids: 73154

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值