码迷,mamicode.com
首页 > 其他好文 > 详细

第八周作业

时间:2016-10-20 01:11:41      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:linux   作业   

1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。

答:

1)集线器是属于物理层的设备,集线器就是将网线集中到一起的机器,也就是多台主机和设备的连接器,也称为多口中继器;可以理解为一根网线中间串接出了多个接口,这么多接口共享这一根网线的带宽,因此这些接口上的设备在使用网络时就会出现冲突,或者“道路”挤占的情况(所有的设备在同一个广播域和同一个冲突域中);功能:信息分发,把一个端口接收的所有信号向所有端口分发出去。集线器现在已很少使用了。

2)网桥是数据链路层的设备;网桥的出现就是为了集线器多个接口共处于一个冲突域的问题,网桥有2个接口,且每个接口设备发送、接收数据都是独立的互不影响(每个接口都是一个冲突域)。网桥已被交换机替代了,现在不再使用了。

3)二层交换机是数据链接层的设备;可以理解为一个多接口的网桥,当然具备了网桥分割冲突域的功能(每个接口都是一个冲突域)。但是(2层)交换机所有接口都在同一个广播域中。

4)三层交换机是网络层的设备;它与二层交换机不同的是:多了路由转发功能,能转发多网段的数据。让基于MAC地址转发的交换机实现了基于IP地址转发。

5)路由器属于网络层的设备;它不但可以隔离冲突域,也隔离广播(每个接口都是一个冲突域,一个广播域)。路由器对于广播数据包不做转发,它根据IP地址进程转发数据包到相应的接口,实现不同的IP网段的互相通信。功能:连接不同的网段并且找到网络中数据传输的最佳路径。

 

2IP地址的分类有哪些?子网掩码的表示形式及其作用


答:

1IP地址分类(IPv4):

 A类:1.0.0.0 -126.0.0.0网段

    0000 0000 – 0 111 1111  1-127

   网络数:可用为126个,127网段当做回环地址;

   每个网络中的主机数:2^24-2

     主机位全为0的是网络地址,全为1的是广播地址;

   默认子网掩码:255.0.0.0

   私网地址:10.0.0.0/ 8;共1个网段;

B类:128.0.0.0 - 191.0.0.0网段

   1000 0000 – 10 11 1111  128-191

   网络数:2^14

   每个网络中的主机数:2^16-2

   默认子网掩码:255.255.0.0

   私网地址:172.16.0.0/ 16 - 172.31.0.0 / 16,共16个网段;

C类:192.0.0.0 -223.0.0.0网段

   1100 0000 – 110 1 1111  192-223

   网络数:2^21

   每个网络中的主机数:2^8-2

   默认子网掩码:255.255.255.0

   私网地址:192.168.0.0/24 - 162.168.255.0 /24,256个网段;

D类:做组播,224.0.0.0 -239.0.0.0网段

   11100000 – 1110 1111  224-239

   网络数:16

E类:做科学研究;

   240.0.0.0- 255.0.0.0

   网络数:16

 

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

答:

1OSI/RM模型:Open System Interconnect Reference Model,开放系统互联参考模型;

  是一个逻辑上的定义,一个规范,它把网络从逻辑上分为了7层。

  目的:是为解决异种网络互连时所遇到的兼容性问题,其最主要的功能就是帮助不同类型的主机实现数据传输。它的最大优点是将服务、接口和协议这三个概念明确地区分开来,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。服务说明某一层为上一层提供一些什么功能,接口说明上一层如何使用下层的服务,而协议涉及如何实现本层的服务。

  一、物理层(PhysicalLayer):比特(Bit

    为数据端设备提供原始比特流的传输的通路;

    例如:网络通信的数据传输介质,由电缆与设备共同构成。

    常见:中继器,网线,HUBRJ-45标准等;

  二、数据链接层(DatalinkLayer):帧(Frame

    在通信的实体间建立数据链路连接;

    例如:将数据分帧,并处理流控制、物理地址寻址、重发等;

    常见:网卡,网桥,二层交换机等;

  三、网络层(NetworkLayer):分组、数据包(Packet

    为数据在结点之间传输创建逻辑链路,并分组转发数据;

    例如:对子网间的数据包进行路由选择;

    常见:路由器,多层交换机,防火墙,IPIPXRIPOSPF

  四、传输层(TransportLayer):数据段(Segment

    提供应用进程之间的逻辑通信;

    例如:建立连接,处理数据包错误、数据包次序;

    常见:TCPUDPSPX,进程,端口(Socket);

  五、会话层(SessionLayer

    建立端连接并提供访问验证和会话管理(SESSION);

    例如:使用校验点可使会话在通信失效时从校验点恢复通信;

    常见:服务器验证用户登录、断点续传;

  六、表示层(PresentationLayer

    提供数据格式转换服务;

    例如:加密与解密,图片解码和编码,数据的压缩和解压缩;

    常见:URL加密,口令加密,图片编解码;

  七、应用层(ApplicationLayer

    访问网络服务的接口;

    例如:为操作系统或网络应用程序提供访问网络服务的接口;

    常见:TelnetFTPHTTPSNMPDNS等;

2TCP/IP模型:

   TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。它分为4层:

  1、网络接口层:

   对实际的网络媒体的管理,定义如何使用实际网络(如:Ethernet)来传送数据。

  2、互联网络层:

   负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如:网际协议(IP)。

  3、传输层:

   提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP等,TCPUDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。

  4、应用层:

   应用程序间沟通的层,如简单电子邮件传输协议(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。


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

答:

Linux系统上配置IP地址步骤:

1)用root用户登录系统,检查网卡设备是否被内核检测到;

[root@ilinux named]# lspci | grep Ethernet
02:01.0 Ethernet controller: IntelCorporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)

2)配置临时IP地址,重启后失效;

[root@ilinux ~]# ifup eth0 192.168.80.200 netmask 255.255.255.0
[root@ilinux~]# ifup eth0           #临时启动网卡;
[root@ilinux ~]# ifdown eth0          #临时禁用网卡;


3)修改网卡配置文件,永久生效;

[root@ilinux ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
IPADDR=192.168.80.200
NETMASK=255.255.255.0
BROADCAST=192.168.80.255
GATEWAY=192.168.80.254
DNS1=218.85.152.99
DNS2=222.222.222.222
ONBOOT=yes               #开机自启动;
NM_CONTROLLED=yes
BOOTPROTO=staic            #设置为静态地址,dhcp为自动获取;
说明:如果是自动获取IP(BOOTPROTO=dhcp),那么IPADDR、NETMASK、GATEWAY都不需要写。

4)重启network服务

[root@ilinux ~]# service network restart
Shutting down interface eth0:                        [ OK  ]
Shutting down loopback interface:                      [  OK ]
Bringing up loopback interface:                       [ OK  ]
Bringing up interface eth0:  Determining if ip address 192.168.80.200 isalready in use for device eth0...                                                            [  OK ]

5)查看网卡参数

[root@ilinux ~]# ifconfig 
eth0     Link encap:Ethernet  HWaddr00:0C:29:4D:BD:B4 
         inet addr:192.168.80.200  Bcast:192.168.80.255  Mask:255.255.255.0
         inet6 addr: fe80::20c:29ff:fe4d:bdb4/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST MTU:1500  Metric:1
         RX packets:12731 errors:0 dropped:0 overruns:0 frame:0
         TX packets:8945 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:1272902 (1.2 MiB)  TXbytes:1150035 (1.0 MiB)


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

答:

1)使用ifup命令配置,重启网络服务后失效;

[root@ilinux ~]# ifup eth0 192.168.80.200 netmask 255.255.255.0
或者:
[root@ilinux ~]# ifconfig eth0 192.168.80.200/24 up


2)修改配置文件,可永久生效;

[root@ilinux ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
IPADDR=192.168.80.200
NETMASK=255.255.255.0
BROADCAST=192.168.80.255
GATEWAY=192.168.80.254
DNS1=218.85.152.99
DNS2=222.222.222.222
ONBOOT=yes                #开机自启动;
NM_CONTROLLED=yes
BOOTPROTO=staic              #设置为静态地址,dhcp为自动获取;
说明:如果是自动获取IP(BOOTPROTO=dhcp),那么IPADDR、NETMASK、GATEWAY都不需要写。

3)用setup命令配置(CentOS 6),nmtuiCentOS 7

   1setup

   2Network configuration

   3Device configuration

   4)选择要配置的网卡,如:eth0,没有可自己添加<NewDevice>

    Name                      eth0
     Device                     eth0                    
    UseDHCP                    [   ]     #若要自动获取,设置为*;         StaticIP                 192.168.80.200                         Netmask                    255.255.255.0
     Defaultgateway IP             192.168.80.254
     PrimaryDNS Server              218.85.152.99
     SecondaryDNS Server            222.222.222.222


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

     在线的主机使用绿色显示;

     不在线的主使用红色显示;

答:        
[root@ilinux ~]# vim ping.sh
#!/bin/bash
#
net="172.16.250."
uphosts=0
downhosts=0
for i in {1..254};do
    ping -c 1 -w 1 ${net}${i}&>/dev/null
    if [ $? -eq 0 ];then
        echo -e "\033[32m${net}${i}"
        let uphosts++
    else
        echo -e "\033[31m${net}${i}"
        let downhosts++
    fi
done
echo -e "\033[37m"
echo  "Up hosts is:$uphosts."
echo  "Down hosts is:$downhosts."


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

答:

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

DEVICE=eth0                  #此设备文件应用到的设备;

TYPE=Ethernet                 #接口类型,常见有EthernetBridge

HWADDR=00:0c:29:4d:bd:b4         #对应的设备的MAC地址;

UUID=                       #设备的唯一标识;

IPADDR=192.168.80.200            #指明IP地址;

NETMASK=255.255.255.0           #子网掩码;

BROADCAST=192.168.80.255         #广播地址;

GATEWAY=192.168.80.254           #默认网关;

DNS1=192.168.80.200               #第一个DNS服务器指向;此处的DNS配置优先于/etc/resolv.conf文件中的DNS配置(重启网络服务后,会覆盖resolv.conf的内容);

DNS2=192.168.80.201         #第二个DNS服务器指向;

ONBOOT=yes                  #在系统引导时是否激活此设备,yes | no

NM_CONTROLLED=yes            #此网卡是否接受NM控制(NMNetwork Manager简称);

BOOTPROTO=                #激活此设备时使用的地址配置协议,dhcp|static|none|bootp

IPV6INIT=no                #是否启动Ipv6yes|no

USERCTL=no                 #普通用户是否可控制此设备;

PEERDNS=                #如果BOOTPROTO的值为dhcp,是否允许dhcpserver分配dns服务器指向信息直接覆盖至/etc/resolv.conf文件中;


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

答:

1)使用ip addr 命令,此方法用ifconfig不显示,临时生效(不会写入配置文件,重启网络服务就失效);

[root@ilinux ~]# ip addr add 192.168.80.210/24 dev eth0:1
[root@ilinux ~]# ip addr
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen1000
   link/ether 00:0c:29:4d:bd:b4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.80.200/24 brd192.168.80.255 scope global eth0
    inet 192.168.80.210/24 scope globalsecondary eth0
   inet6 fe80::20c:29ff:fe4d:bdb4/64 scope link
      valid_lft forever preferred_lft forever

2)使用ifconfig命令,临时生效(不会写入配置文件,重启网络服务就失效);

[root@ilinux ~]# ifconfigeth0:1 192.168.80.210/24 up
[root@ilinux ~]# ifconfigeth0:1 192.168.80.210/24 up
[root@ilinux ~]# ifconfig
eth0      Linkencap:Ethernet  HWaddr00:0C:29:4D:BD:B4 
          inetaddr:192.168.80.200 Bcast:192.168.80.255 Mask:255.255.255.0
          inet6 addr:fe80::20c:29ff:fe4d:bdb4/64 Scope:Link
          UP BROADCAST RUNNINGMULTICAST  MTU:1500  Metric:1
          RX packets:6212errors:0 dropped:0 overruns:0 frame:0
          TX packets:7165errors:0 dropped:0 overruns:0 carrier:0
          collisions:0txqueuelen:1000
          RX bytes:540133(527.4 KiB)  TX bytes:714909 (698.1 KiB)
 
eth0:1    Linkencap:Ethernet  HWaddr00:0C:29:4D:BD:B4 
          inetaddr:192.168.80.210 Bcast:192.168.80.255 Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST MTU:1500  Metric:1

3)创建配置文件ifcfg-eth0:1

[root@ilinux ~]# vim  /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
TYPE=Ethernet
IPADDR=192.168.80.210
NETMASK=255.255.255.0
GATEWAY=192.168.80.254
ONBOOT=yes
BOOTPROTO=static


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

1ifconfig命令

   #ifconfig             #显示所有网卡的信息;

   #ifconfig eth0         #显示指定网卡eth0的网络信息;

   #ifconfig eth0 up/down    #启用或禁用网卡eth0(重启网络服务后失效);

   #ifup/ifdown eth0       #启用或禁用网卡eth0(重启网络服务后失效);

2ip命令

   常用的子命令ip { link | addr | route }

    ip link

       show [ DEVICE ] [ up | down ] :显示状态是updown的接口,默认显示up接口;

       set DEVICE { up | down | arp { on | off } } :设置接口的二层属性;

    ip addr

       ipaddr { add | del } IFADDR dev STRING

     添加IP:

       [root@ilinux~]# ip addr add 192.168.80.222/24 dev eth0:1     

     删除IP:

      [root@ilinux~]# ip addr del 192.168.80.222 dev eth0:1 

    ip route

     显示路由条目;

       # ip route                 

     添加路由;

       # ip route add  TARGET  via GW  dev  IFACE src  SOURCE_IP  

     示例:

     主机路由:IP

       #ip route add 192.168.1.3 via 172.16.0.1 dev eth0

     网络路由:NETWORK/MASK

       #ip route add 192.168.0.0/24 via 172.16.1.3

     添加网关;

       #ip route add default via GW dev IFACE  

     删除路由                

      #ip route del TARGET               

3netstat命令

   查看当前系统网络连接,路由信息表,网卡信息;

   常用:

       netstat-r

       netstat-ntlp

       netstat-nulp

       netstat-na

4ss命令:

   网络状态查看工具;

   格式:ss[OPTIONS] . . .  [FILTER]

   选项:

       -ttcp协议相关;

       -uudp协议相关;

       -w:裸套接字相关;

       -xunix sock相关;

       -llisten状态的连接;

       -a:所有;

       -n:数字格式;

       -p:相关的程序及PID

       -e:扩展的信息;

       -m:内存用量;

       -o:计时器信息;

   常用:

       # ss -unl

       # ss -tnl

       # ss -na


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

答:

1RPM管理

  安装:rpm -ivh PACKAGE

    rpm{-i|--install} [install-options] PACKAGE_FILE ...

       -vverbose

         -vv :显示更详细信息;

       -h:以#显示程序包管理执行进度,每个#表示2%的进度;

 

        [install-options]

            --test :测试安装,但不真正执行安装过程:dryrun模式;

            --nodeps :忽略依赖关系;

            --replacepkgs :重新安装;

           --ignoreos :忽略系统版本;CentOS6的包可以在CentOS 7上安装;

            --nosignature :不检查包的来源合法性;

            --nodigest :不检查包完整性;

            --noscripts :不执行程序包中的脚本片段;

                                                          %pre :安装前脚本;--nopre

                                                          %post :安装后脚本;--nopost

                                                          %preun :卸载前脚本;--nopreun

                                                          %postun :卸载后脚本;--nopostun

 

       示例:

            # rpm -ivh bind

 

  升级:rpm -Uvh PACKAGE

     rpm{-U|--upgrade} [install-options] PACKAGE_FILE ...

     rpm {-F|--freshen}[install-options] PACKAGE_FILE ...

 

       upgrage :安装有旧版程序包,则升级;如果不存在旧版程序包,则安装;

       freshen :安装有旧版程序包,则升级;如果不存在旧版程序包,则不执行升级操作;

 

         rpm–Uvh PACKAGE_FILE . . .

         rpm–Fvh PACKAGE_FILE . . .

 

         --oldpackage :降级;

         --force :强制升级;

 

   注意:

    (1)不要对内核做升级操作:Linux支持多内核版本并存,因此,可直接安装新版本内核;

    2)如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpm)后保存;

 

  查询:-q

     rpm {-q|--query} [select-options][query-options]

 

     [select-options]

          -a--all :查询所有已安装包;

          -f--file :查询指定的文件由哪个程序安装包生成;

        -p--package  /PATH/TO/PACKAGE_FILE :查询尚未安装的程序包文件;

 

          --whatprovides CAPABILITY :查询指定的CAPABILITY由哪个程序包所提供的;

          --whatrequires CAPABILITY :查询指定的CAPABILITY被那个程序包所依赖;

 

    [query-options]

       --changelog :查询rpm包的changlog

      -c--configfiles :查询程序的配置文件;

      -d, --docfiles :查询程序的文档;

      -i, --info information

      -l, --list :查看指定的程序包安装后生成的所有文件;

      --scripts :程序包自带的脚本片段;

      --triggers, --triggerscripts

      -R, --requires :查询指定的程序包所依赖的CAPABILITY

      --provides :列出指定程序包所提供的CAPABILITY

 

    常用用法:

       -qi PACKAGE

       -qf FILE

       -qc PACKAGE

       -ql PACKAGE

       -qd PACKAGE

       -qpi PACKAGE_FILE

       -qpl PACKAGE_FILE

       -qa

 

         卸载:rpm -evh PACKAGE


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

答:如果是用虚拟机安装,请先选择好系统iso文件,并连接;

1)创建挂载目录

  # mkdir /media/cdrom

2)挂载光盘:-r 只读;

  # mount [-r -t iso9660] /dev/cdrom /media/cdrom/

3)添加本地yum源配置文件:

  [root@ilinux~]# vim/etc/yum.repos.d/CentOS-local.repo
  [CentOS6.6]
  name=CentOS6.6
  baseurl=file:///media/cdrom
  gpgcheck=0


12、写一个脚本,完成以下功能

   (1) 假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干;

   (2) 显示所有以K开头的文件的文件名,并且给其附加一个stop字符串;

   (3) 显示所有以S开头的文件的文件名,并且给其附加一个start字符串;

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

答:
#!/bin/bash
k=0
s=0
for i in $(ls /etc/rc.d/rc3.d/K* | grep -o"[^/]*$");do
   echo "$i stop"
   let k=$k+1
done
for i in $(ls /etc/rc.d/rc3.d/S* | grep -o"[^/]*$");do
   echo "$i start"
   let s=$k+1
done
echo "The number of files startingwith K : $k."
echo "The number of files startingwith S : $s."

 

13、写一个脚本,完成以下功能

   (1) 脚本能接受用户名作为参数;

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

答:
#/bin/bash
sum=0
for i in $*;do
       if id $i &> /dev/null;then
             uid=$(id -u $i)
             let sum+=$uid
       else
             echo "User $i notfound."
       fi
done
echo "User ID is the sum of:$sum."

 

14、写一个脚本

   (1) 传递一些目录给此脚本;

   (2) 逐个显示每个目录的所有一级文件或子目录的内容类型;

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

答:
#/bin/bash
#
d=0
f=0
ls -l $* >/dev/null
for a in $*;do
   for b in $(ls $a);do
       if [ -f $a/$b ];then
           let f+=1
       else
           [ -d $a/$b ]
           let d+=1
       fi
   done
done
echo "directory: $d,file: $f."


15、写一个脚本

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

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

答:
         #!/bin/bash
    #
   read -p "Please inpute users name:" USERS
 
   for user in $USERS;do
       if id $user &> /dev/null ;then
           if [ `id -u $user` -ge 500 ];then
                echo "$user is normaluser."
            else
                echo "$user is not normaluser."
           fi
       else
           echo "$user is not found."
       fi
   done

 

16、写一个脚本

   (1) 添加10用户user1-user10;密码同用户名;

   (2) 用户不存在时才添加;存在时则跳过;

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

答:
#/bin/bash
#
count=10
for i in {1..10};do
   if id user$i &> /dev/null;then
       let count--
   else
       useradd user$i
       echo user$i | passwd --stdin user$i &> /dev/null
   fi
done
echo "Altogether add $countusers."


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

答:
#!/bin/bash
#
net="172.16.250.”
for i in {20..100};do
   ping -c 1 -w 1 ${net}${i} &>/dev/null
   if [ $? -eq 0 ];then
       echo "${net}${i}"
   fi
done


18、打印九九乘法表;

答:
用while循环实现:
#/bin/bash
#
declare -i i=1
declare -i j=1
while [ $j -le 9 ];do
   while [ $i -le $j ];do
       echo -e -n "${i}X${j}=$[ $i*$j ]\t"
       let i++
   done
   echo
   let i=1
   let j++
done
 
用until循环实现:
#/bin/bash
#
declare -i j=1
declare -i i=1
until [ $j -gt 9 ];do
   until [ $i -gt $j ];do
       echo -n -e "${i}X${j}=$[ $i*$j]\t"
       let i++
   done
   echo
   let i=1
   let j++
done
 
用for循环实现1:
#/bin/bash
#
for j in {1..9};do
   for i in `seq 1 $j`;do
       echo -en "${i}X${j}=$[ $i*$j ]\t"
   done
   echo
done

用for循环实现2:
#!/bin/bash
#
declare -i sum=0
 
for((j=1;j<=9;j++));do
   for((i=1;i<=j;i++));do
       echo -e -n "${i}X${j}=$[ $i*$j ]\t"
   done
   echo
done


本文出自 “ilinux” 博客,请务必保留此出处http://shenzhijin.blog.51cto.com/1741240/1863511

第八周作业

标签:linux   作业   

原文地址:http://shenzhijin.blog.51cto.com/1741240/1863511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!