第八周作业

1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。
    集线器(HUB)主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。集线器是一种共享设备,HUB本身不能识别目的地址,当同一局域网内的A主机给B主机传输数据时,数据包在以HUB为架构的网络上是以广播方式传输的,由每一台终端通过验证数据包头的地址信息来确定是否接收。也就是说,在这种工作方式下,同一时刻网络上只能传输一组数据帧的通讯,如果发生碰撞还得重试。
    网桥(Bridge)是早期的两端口数据链路层网络设备,用来连接不同网段的计算机网络设备同时它又可隔离冲突域,因为它的两个端口不是共享一条背板总线(分别有一条独立的交换信道),比当时的集线器(Hub)性能更好(集线器上各端口都是共享同一条背板总线的)。网桥不但能扩展网络的距离或范围,而且可提高网络的性能、可靠性和安全性。网络1 和网络2 通过网桥连接后,网桥接收网络1 发送的数据包,检查数据包中的地址,如果地址属于网络1 ,它就将其放弃,相反,如果是网络2 的地址,它就继续发送给网络2.这样可利用网桥隔离信息,将同一个网络号划分成多个网段(属于同一个网络号),隔离出安全网段,防止其他网段内的用户非法访问。由于网络的分段,各网段相对独立(属于同一个网络号),一个网段的故障不会影响到另一个网段的运行。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switch)所取代。
    二层交换机(Switch)可以说同时是集线器和网桥的升级换代产品,因为交换机具有集线器一样的集中连接功能,同时它又具有网桥的数据交换功能。所以可以这样说,交换机是带有交换功能的集线器,或者说交换机是多端口的网桥。外形上,集线器与交换机产品没什么太大区别。
    路由器 (Router)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器来完成。路由器与普通二层交换机的差别在于,路由器是属于OSI第三层的产品,而普通二层交换机是OSI第二层的产品,路由器可以连接两个以上不同网段的网络,而普通二层交换机只能在同一个网段进行通讯。它也不同于三层交换机,他拥有更强大的路由功能,比如选择最佳路由、负荷分担、链路备份以及与其他网络进行路由信息的交换等功能。
    三层交换机(3layer Switch)是一个带有第三层路由功能的二层交换机,三层交换机可以处理第三层网络层协议,用于在局域网内连接不同网段,通过对缺省网关的查询学习来创建两个网段之间的直接连接。三层交换机具有二层交换机的速度并一定的“路由”功能,但相对于路由器来说功能较弱,只能用于同一类型的局域网子网之间的互连,不能替代路由器作为局域网与外网通讯的连接设备。
2、IP地址的分类有哪些?子网掩码的表示形式及其作用
IP地址分成了A类、B类、C类、C类、E类
    A类:1.0.0.1~126.255.255.254,注意127.x.x.x不能用。
    B类:128.0.0.1~191.255.255.254,注意169.254.x.x不能用,用作用户获取不到IP时自动分配的IP地址。
    C类:192.0.0.1~223.255.255.254,
    D类:224.0.0.1~239.255.255.254
    E类:240.0.0.1~255.255.255.254
私有地址:
    A类:10.0.0.0~10.255.255.255
    B类:172.16.0.0~172.31.255.255
    C类:192.168.0.0~192.168.255.255
子网掩码:
    1)它用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机。
    2)给定IP地址,根据子网掩码能够求得IP地址的子网地址是多少,主机地址是多少。
    3)给定一个IP地址,我们能够看出他是A类地址还是B类还是C类还是D类还是E类,因此我们能够知道默认网络地址是哪几位,主机地址是哪几位,再根据子网掩码就能看出子网数是多少个,主机数是多少个。
计算过程如下: 
    1)将ip地址与子网掩码转换成二进制; 
    2)将二进制形式的ip地址与子网掩码做’与’运算,将答案化为十进制便得到网络地址; 
    3)将二进制形式的子网掩码取’反’; 
    4)将取’反’后的子网掩码与ip地址做’与’运算,将答案化为十进制便得到主机地址。 
举个例子:
假设有一个I P 地址:192.168.0.1 
    子网掩码为:255.255.255.0 
    化为二进制为:I P 地址11000000.10101000.00000000.00000001 
    子网掩码11111111.11111111.11111111.00000000 
    将两者做’与’运算得:11000000.10101000.00000000.00000000 
    将其化为十进制得:192.168.0.0 

3、计算机网络的分成模型有哪些(OSI模型和TCP/IP模型),每一层的功能及涉及到的物理设备有哪些。

第八周作业

4、如何将Linux主机接入到TCP/IP网络,请描述详细的步骤。(手动指定的方式)

    1)首先确定自身所处的网络,以及要接入的网络(这里以本地192.168.0.0/24,要接入互联网为例);

    2)将虚拟机网卡设置为桥接模式;

    3)编辑Linux中网卡配置文件ifcfg-ens33(网卡名称不同环境或有不同)

[root@centos7 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33                        
UUID=3c674067-39bc-4cba-be46-3affec1b737b
DEVICE=ens33                      
ONBOOT=yes                         
IPADDR=192.168.0.11            #设置为和本地网络同网段的IP(必配)
NETMASK=255.255.255.0          #这里掩码设置为24位(必配)
GATEWAY=192.168.0.1            #路由器即网关地址(互联网通信必配)
DNS1=218.30.118.6              #运营商DNS地址(互联网通信必配)

    4)重启网卡

[root@centos7 ~]# systemctl restart network.service

     5)测试与互联网通信

[root@centos7 ~]# ping -c 1 www.baidu.com
PING www.a.shifen.com (115.239.211.112) 56(84) bytes of data.
64 bytes from 115.239.211.112: icmp_seq=1 ttl=55 time=28.1 ms

--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 28.125/28.125/28.125/0.000 ms

5、为Linux主机配置网络信息的方式有哪些,请描述各个过程。

    1)ifconfig命令

        命令格式:ifconfig IFNAME IP/Netmask [up]

        例:

[root@centos7 ~]# ifconfig ens33:0 3.3.3.33/24
[root@centos7 ~]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 3.3.3.33  netmask 255.255.255.0  broadcast 3.3.3.255
        ether 00:0c:29:0a:35:17  txqueuelen 1000  (Ethernet)

    2)ip命令

        命令格式:ip addr {add|del} IP/Netmask dev STRING

        例:

[root@centos7 ~]# ip addr add 3.3.3.34/24 dev ens33
[root@centos7 ~]# ip addr sh dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0a:35:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 3.3.3.34/24 scope global ens33
       valid_lft forever preferred_lft forever

    3)GUI工具

        以图形方式如KDE、GNOME登录系统后图形化的网络配置工具进行设置;

    4)TUI工具

        CentOS6:setup命令

        CentOS7:nmtui命令

    5)编辑配置文件

[root@centos7 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33                        
UUID=3c674067-39bc-4cba-be46-3affec1b737b
DEVICE=ens33                      
ONBOOT=yes                            
IPADDR=192.168.0.11               #IP地址
NETMASK=255.255.255.0             #子网掩码

[root@centos7 ~]# systemctl restart network.service       #重启网卡生效      

6、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;
     在线的主机使用绿色显示;
     不在线的主使用红色显示;

7、详细描述每个网络接口的配置文件中各个参数的含义和其所对应的值;

参数名 含义
DEVICE 此配置文件所关联到的设备,其值通常应该与ifcfg-IFNAME中的IFNAME相同。 [IFNAME]
BOOTPROTO 启动此设备时使用的配置协议。 static | none | dhcp
HWADDR 网卡的MAC地址,此地址应该与网卡设备ROM中固定的地址保持一致。 [MAC]
NM_CONTROLLED NM即NetworkManager的简写,指定该网卡是否受NM服务的管理。 yes | no
ONBOOT 此设备是否随OS启动而激活。 yes | no
TYPE 设备类型 Ethernet | Bridge
UUID 网卡设备的唯一识别码 [UUID]
IPADDR 此接口的IP地址 [IPADDR]
NETMASK 子网掩码 [NETMASK]
GATEWAY 网关 [GATEWAY]
DNS1 主DNS服务器 [DNS1]
DNS2 备用DNS服务器 [DNS2]
DNS3 第三备用DNS服务器 [DNS3]
IPV6INIT 是否初始化IPv6协议地址 yes | no
USERCTL 是否允许普通用户管理此接口 yes | no
PEERDNS 当BOOTPROTO为dhcp时,是否允许dhcp服务器提供的DNS服务器覆盖本地手动配置的DNS服务器 yes | no

8、如何给网络接口配置多个地址,有哪些方式?

    1)多IP方式(临时生效)

[root@centos7 network-scripts]# ip addr add 3.3.3.1/24 dev ens33
[root@centos7 network-scripts]# ip addr sh dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0a:35:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 3.3.3.1/24 scope global ens33
       valid_lft forever preferred_lft forever

    2)子接口方式(临时生效)

[root@centos7 network-scripts]# ifconfig ens33:0 3.3.3.2/24
[root@centos7 network-scripts]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 3.3.3.2  netmask 255.255.255.0  broadcast 3.3.3.255
        ether 00:0c:29:0a:35:17  txqueuelen 1000  (Ethernet)

    3)子接口配置文件方式(永久生效)

[root@centos7 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=3.3.3.2
NETMASK=255.255.255.0
[root@centos7 ~]# systemctl restart network.service
[root@centos7 ~]# ifconfig ens33:0
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 3.3.3.2  netmask 255.255.255.0  broadcast 3.3.3.255
        ether 00:0c:29:0a:35:17  txqueuelen 1000  (Ethernet)

9、常用的网络管理类工具有哪些,并用示例形式描述他们的使用方法。

    1)ifconfig命令

[root@centos7 ~]# ifconfig ens33:0 3.3.3.11/24 up                    #添加IP
[root@centos7 ~]# ifconfig ens33:0                                   #查看IP
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 3.3.3.11  netmask 255.255.255.0  broadcast 3.3.3.255
        ether 00:0c:29:0a:35:17  txqueuelen 1000  (Ethernet)
[root@centos7 ~]# ifconfig ens33:0 down                              #删除IP

    2)ip命令

[root@centos7 ~]# ip link ens36 down                #关闭网卡ens36
[root@centos7 ~]# ip link set name ens34 ens36      #将网卡ens36更名为ens34
[root@centos7 ~]# ip link ens34 up                  #开启网卡ens34
[root@centos7 ~]# ip link set ens34 promisc on      #开启网卡ens34的混杂模式
[root@centos7 ~]# ip link set ens34 promisc off     #关闭网卡ens34的混杂模式

[root@centos7 ~]# ip addr add 3.3.3.1/24 dev ens33                        #为网卡ens33添加IP
[root@centos7 ~]# ip addr sh dev ens33                                    #显示网卡ens33信息
[root@centos7 ~]# ip addr del 3.3.3.1/24 dev ens33                        #删除网卡ens33的IP

[root@centos7 ~]# ip route add 3.3.3.0/24 via 192.168.0.1        #添加到3.3.3.0/24网段的路由,网关为192.168.0.1       
[root@centos7 ~]# ip route add default  via 192.168.0.1          #添加默认路由,网关为192.168.0.1
[root@centos7 ~]# ip route del 3.3.3.0/24 dev ens33              #删除到3.3.3.0/24网段,且网卡为ens33的路由 

    3)setup/nmtui/nmcli命令(以CentOS7下的nmtui为例)

        在命令行输入nmtui,选择Edit a connection

第八周作业

        选择要设置的网卡

第八周作业

        设置网卡信息

第八周作业

10、Linux系统软件包管理方法(安装、升级、卸载等操作)有哪些,以及如何管理的。

    1)安装

        用法:rpm {-i|–install} [install-options] PACKAGE_FILE1…
        -h:hash,以#来表示安装进度
        -v:–verbose:显示安装过程中的详细信息
        –test:不执行真正的安装过程,而仅报告依赖关系及冲突信息等
        –nodeps:忽略依赖关系,副作用是能安装成功,但未必能运行成功
        –replacepkgs:覆盖安装
        –force:强制安装
        -安装时常用的组合:-ivh,-ivvh

    2)升级

        用法:rpm {-U|–upgrade} [install-options] PACKAGE_FILE…

        -U:升级或安装

        -F:升级

        –test:不执行真正的安装过程,而仅报告依赖关系及冲突信息等;

        –nodeps:忽略依赖关系,副作用是能安装成功,但未必能运行成功;

        –oldpackage:降级到旧版本

        组合使用:-Uvh,-Fvh

    3)卸载

         用法:rpm {-e|–erase} [–allmatches] [–nodeps] [–test] PACKAGE_NAME

         –nodeps:忽略依赖关系;

         –test:测试卸载;

         –allmatches:如果一个程序包同时安装多个版本,则此选项一次全部卸载之

    4)查询

         用法:rpm {-q|–query} [select-options] [query-options]

         rpm -q PACKAGE_NAME:查询某包或某些包是否安装

         rpm -qa:查询已经安装的所有包

         rpm -qf FILE:查询某文件是由哪个包安装生成

         rpm -qpi PACKAGE_FILE:查询尚未安装的包文件的相关信息

         rpm -qi PACKAGE_NAME:查询某包的简要说明信息

         rpm -ql PACKAGE_NAME:查询某包安装生成的文件列表

         rpm -qc PACKAGE_NAME:查询某包安装完成后生成的所有配置文件

         rpm -q –requires PACKAGE_NAME:查询某包所依赖的capabilities

    RPM包是通过RPM包管理数据库来记录一些与软件相关的信息来进行管理的,可以通过下面命令及选项来构建数据库:

        用法:rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY]

        –initdb:初始化数据库,即数据库完全不存在时,可以新建一个;

        –rebuilddb:无论当前数据存在与否,都会直接重建此库,构建的数据库存放在/var/lib/rpm当中

11、如何使用发行版光盘作为yum repository,请描述该过程。

    1)挂载光盘到指定挂载点,这里为/mnt/cdrom

[root@centos6 ~]# mount /dev/cdrom /mnt/cdrom/

     2)在/etc/yum.repos.d下新建yum repo配置文件

[root@centos6 yum.repos.d]# vim local.repo
[cdrom]
name=CentOS 6.8 X86_64 on dvd1
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1

     3)查看yum资源库

[root@centos6 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id                                        repo name                                                        status
cdrom                                          CentOS 6.8 X86_64 on dvd1                                        6,696
repolist: 6,696

12、写一个脚本,完成以下功能
   (1) 假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干;
   (2) 显示所有以K开头的文件的文件名,并且给其附加一个stop字符串;
   (3) 显示所有以S开头的文件的文件名,并且给其附加一个start字符串;

   (4) 分别统计S开头和K开头的文件各有多少;

#!/bin/bash
declare -i s=0
declare -i k=0
for i in /etc/rc.d/rc3.d/K*;do
    echo "$i stop"
    let k++
done
for j in /etc/rc.d/rc3.d/S*;do
    echo "$j start"
    let s++
done
echo "----------------------"
echo -e "K:$k\tS:$s"

执行结果:
[root@centos6 script]# ./service.sh 
/etc/rc.d/rc3.d/K10saslauthd stop
/etc/rc.d/rc3.d/K15svnserve stop
/etc/rc.d/rc3.d/K36mysqld stop
/etc/rc.d/rc3.d/K61nfs-rdma stop
/etc/rc.d/rc3.d/K87restorecond stop
/etc/rc.d/rc3.d/K89netconsole stop
/etc/rc.d/rc3.d/K89rdisc stop
/etc/rc.d/rc3.d/K92iptables stop
/etc/rc.d/rc3.d/K95rdma stop
/etc/rc.d/rc3.d/S02lvm2-monitor start
/etc/rc.d/rc3.d/S08ip6tables start
/etc/rc.d/rc3.d/S10network start
/etc/rc.d/rc3.d/S11auditd start
/etc/rc.d/rc3.d/S12rsyslog start
/etc/rc.d/rc3.d/S15mdmonitor start
/etc/rc.d/rc3.d/S22messagebus start
/etc/rc.d/rc3.d/S25blk-availability start
/etc/rc.d/rc3.d/S25netfs start
/etc/rc.d/rc3.d/S26haldaemon start
/etc/rc.d/rc3.d/S26udev-post start
/etc/rc.d/rc3.d/S50kdump start
/etc/rc.d/rc3.d/S55sshd start
/etc/rc.d/rc3.d/S80postfix start
/etc/rc.d/rc3.d/S90crond start
/etc/rc.d/rc3.d/S99libvirt-guests start
/etc/rc.d/rc3.d/S99local start
----------------------
K:9     S:17

13、写一个脚本,完成以下功能
   (1) 脚本能接受用户名作为参数;

   (2) 计算此些用户的ID之和;

#!/bin/bash
if [ $# -eq 0 ];then
    echo "Usage $0 arg1 arg2 ..."
    exit 1
fi

declare -i s=0
for name in $*;do
    if id $name &>/dev/null;then
        uid=$(id -u $name)
        s=s+uid
    else
        echo "$name not exists!"
        continue
    fi
done
echo "SUM: $s"
执行结果:
[root@centos6 script]# ./sumuid.sh root bin ftp magedu hahaha
hahaha not exists!
SUM: 515

14、写一个脚本

   (1) 传递一些目录给此脚本;
   (2) 逐个显示每个目录的所有一级文件或子目录的内容类型;

   (3) 统计一共有多少个目录;且一共显示了多少个文件的内容类型;

#!/bin/bash
if [ $# -lt 1 ];then
    echo "Usage $0 arg1 arg2 ..."
    exit 1
fi

declare -i s1=0
declare -i s2=0
for dir in $*;do
    [ ! -d $dir ] && continue
    file $dir/*
    dircnt=$(file $dir/* |grep -c "directory$")
    type_cnt=$(file $dir/*|awk '{print $2}'|sort|uniq|wc -l)
    let s1+=dircnt
    let s2+=type_cnt
done
echo "Directory count: $s1"
echo "File type count: $s2"
执行结果:
[root@centos6 script]# ./filetype.sh /var/log/ /root/ 
/var/log//anaconda.ifcfg.log:   ASCII text
/var/log//anaconda.log:         ASCII English text
/var/log//anaconda.program.log: ASCII English text, with very long lines, with overstriking
/var/log//anaconda.storage.log: ASCII C++ program text, with very long lines
/var/log//anaconda.syslog:      ASCII English text, with very long lines
/var/log//anaconda.xlog:        ASCII English text
/var/log//anaconda.yum.log:     ASCII text
/var/log//audit:                directory
/var/log//boot.log:             ASCII text, with CRLF, CR line terminators, with escape sequences
/var/log//btmp:                 empty
/var/log//ConsoleKit:           directory
/var/log//cron:                 ASCII text
/var/log//dmesg:                ASCII English text
/var/log//dmesg.old:            ASCII English text
/var/log//dracut.log:           ASCII text
/var/log//lastlog:              data
/var/log//maillog:              ASCII English text
/var/log//messages:             ASCII English text
/var/log//mysqld.log:           empty
/var/log//secure:               ASCII text
/var/log//spooler:              empty
/var/log//tallylog:             empty
/var/log//wtmp:                 data
/var/log//yum.log:              ASCII text
/root//anaconda-ks.cfg:    ASCII English text
/root//install.log:        ASCII text
/root//install.log.syslog: ASCII text
/root//script:             directory
Directory count: 3
File type count: 6

15、写一个脚本
  通过命令行传递一个参数给脚本,参数为用户名

  如果用户的id号大于等于500,则显示此用户为普通用户;

#!/bin/bash
if [ $# -lt 1 ];then
    echo "Usage $0 USERNAME"
    exit 1
fi

user=$1
if id $user &>/dev/null;then
    uid=$(id -u $user)
    if [ $uid -ge 500 ];then
        echo "$user is common user"
    else
        echo "$user is sys user"
    fi
else
    echo "$user not exists!"
    exit 2
fi
执行结果:
[root@centos6 script]# ./commuser.sh
Usage ./commuser.sh USERNAME
[root@centos6 script]# ./commuser.sh magedu
magedu is common user
[root@centos6 script]# ./commuser.sh ftp
ftp is sys user
[root@centos6 script]# ./commuser.sh hahaha
hahaha not exists!

16、写一个脚本
   (1) 添加10用户user1-user10;密码同用户名;
   (2) 用户不存在时才添加;存在时则跳过;

   (3) 最后显示本次共添加了多少用户;

#!/bin/bash
declare -i s=0
for i in {1..10};do
    if ! id user$i &>/dev/null;then
        useradd user$i
        echo "user$i"|passwd --stdin user$i &>/dev/null
        let s+=1
    else
        echo "user$i already exists!"
        continue
    fi
done
echo "Added $s users."
执行结果:
[root@centos6 script]# ./adduser.sh 
user5 already exists!
user6 already exists!
Added 8 users.

17、写一脚本,用ping命令测试172.16.250.20-172.16.250.100以内有哪些主机在线,将在线的显示出来;

#!/bin/bash
for i in {20..100};do
    if ping -c 1 172.16.250.$i &>/dev/null;then
        echo "172.16.250.$i is UP"
    else
        continue
    fi
done
执行结果:
[root@centos6 script]# ./ping.sh 
172.16.250.31 is UP
172.16.250.41 is UP
172.16.250.53 is UP
172.16.250.94 is UP

18、打印九九乘法表;

#!/bin/bash
for ((i=1;i<=9;i++));do
    for ((j=1;j<=i;j++));do
        echo -n -e "${j}X${i}=$[$i*$j]\t"
    done
    echo
done
执行结果:
[root@centos6 script]# ./99multi.sh  
1X1=1
1X2=2   2X2=4
1X3=3   2X3=6   3X3=9
1X4=4   2X4=8   3X4=12  4X4=16
1X5=5   2X5=10  3X5=15  4X5=20  5X5=25
1X6=6   2X6=12  3X6=18  4X6=24  5X6=30  6X6=36
1X7=7   2X7=14  3X7=21  4X7=28  5X7=35  6X7=42  7X7=49
1X8=8   2X8=16  3X8=24  4X8=32  5X8=40  6X8=48  7X8=56  8X8=64
1X9=9   2X9=18  3X9=27  4X9=36  5X9=45  6X9=54  7X9=63  8X9=72  9X9=81

原创文章,作者:N26-西安-方老喵,如若转载,请注明出处:http://www.178linux.com/69434

(0)
N26-西安-方老喵N26-西安-方老喵
上一篇 2017-02-27
下一篇 2017-02-27

相关推荐

评论列表(1条)

  • 马哥教育
    马哥教育 2017-03-06 19:19

    很的很不错,图文并茂,请断续保持