首页 > 代码库 > 马哥2016全新Linux+Python高端运维班-Linux 网络基础管理,包管理,bash脚本练习

马哥2016全新Linux+Python高端运维班-Linux 网络基础管理,包管理,bash脚本练习

本周作业内容:

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

    集线器:又称“HUB”主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它工作于OSI(开放系统互联参考模型)参考模型第一层,即“物理层”。
    二层交换机:工作于OSI模块的第2层(数据链路层),故称为二层交换机。可以识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录在自己内部的一个地址表中。
    三层交换机:就是具有路由功能的交换机,工作在OSI模型的第三层(网络层)最重要目的是加快大型局域网内部的数据交换,能够做到一次路由,多次转发。可用于网络的汇聚与核心设备。
    路由器:是在OSI模型的第三层——网络层——连接两个网络、并对分组报文进行转发的设备。网桥是根据MAC地址进行处理,而路由器则是根据IP地址进行处理的。路由器的主要作用就是为经过路由器的数据包选择一条最佳传输途径,并将数据包有效地送达目的地。

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

    现在的IP网络使用32位地址,以点分十进制表示.
    A类:
    0 000 0000 - 0 111 1111: 1-127
    网络数:126, 127
    每个网络中的主机数:2^24-2
    默认子网掩码:255.0.0.0
    私网地址:10.0.0.0/8
     
    B类:
    10 00 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
     
    C类:
    110 0 0000 - 110 1 1111: 192-223
    网络数:2^21
    每个网络中的主机数:2^8-2
    默认子网掩码:255.255.255.0
    私网地址:192.168.0.0/24-192.168.255.0/24
     
    D类:组播
    1110 0000 - 1110 1111: 224-239
    子网掩码又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。区分网络上的主机是否处于同一子网络中。

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

OSI七层模型: TCP/IP 4层模型:
应用层:提供应用程序之间的通信。    应用层
表示层:处理数据格式,数据加密
会话层:建立,维护,管理回话连接及操作系统和网络接口和各种数据
传输层:建立主机端到端连接。 传输层tcp udp
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。涉及设备:路由器,防火墙。网络层ipv4 ipv6
数据链路层:提供介质访问,链路管理,将数据分桢并处理流控制。涉及设备:网卡,网桥,交换机。设备驱动程序和硬件
 物理层:比特流传输,将数据转换为可通过物理介质传送的电子信号。涉及设备双绞线、同轴电缆,集线器。

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

    配置IP:vim /etc/sysconfig/network-scripts/ifcfg-eth0
        示例:    DEVICE=eth0    ##设备名称
                HWADDR=00:0C:29:AA:09:30    ##MAC地址
                TYPE=Ethernet    ##以太网类型
                UUID=946794ba-f825-4a22-8888-e825aa2eef25    ##设备UUID
                ONBOOT=yes    ##启动设置yes开启启动
                NM_CONTROLLED=yes    ##network manger 开启|关闭
                BOOTPROTO=static    ##此为静态配置,也可以改为“none”
                IPADDR=192.168.137.32    ##IP地址
                NETMASK=255.255.255.0    ##掩码
                GATEWAY=192.168.137.1    ##网关
                DNS1=192.168.137.1    ##这里配置就不用再配置下面的dns服务
    修改dns服务器:vim /etc/resolv.conf
                添加 nameserver 192.168.137.1
    重启服务:
            service network restart

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

    1)ifconfig命令方式:ifconfig eth0 192.168.137.35 netmask 255.255.255.0
    2)ip命令方式: ip addr add 192.168.137.31/24 dev eth0
    3)配置文件方式:配置同第4题。

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

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

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

    [root@liu homework8]# cat 6.sh 
    #!/bin/bash
    #
    net=‘192.168.137‘
    declare -i uphosts=0 
    declare -i 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} is up.\033[0m"
        let uphosts++
        else
        echo -e "\033[31m ${net}.${i} is down.\033[0m"
        let downhosts++
        fi
    done
    echo "Up hosts: $uphosts."
    echo "Down hosts: $downhosts."
    测试脚本:
    ]# bash 6.sh    
     192.168.137.30 is up.    #绿色
     192.168.137.31 is down #红色
     192.168.137.32 is up.    #绿色
    Up hosts: 4.
    Down hosts: 250.

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

            DEVICE:此配置文件应用到的设备;
            HWADDR:对应的设备的MAC地址;
            BOOTPROTO:激活此设备时使用的地址配置协议,常用的dhcp, static, none, bootp;
            NM_CONTROLLED:NM是NetworkManager的简写;此网卡是否接受NM控制;CentOS6建议为“no”;
            ONBOOT:在系统引导时是否激活此设备;
            TYPE:接口类型;常见有的Ethernet, Bridge;
            UUID:设备的惟一标识;
            IPADDR:指明IP地址;
            NETMASK:子网掩码;
            GATEWAY: 默认网关;
            DNS1:第一个DNS服务器指向;
            DNS2:第二个DNS服务器指向;
            USERCTL:普通用户是否可控制此设备;
            PEERDNS:如果BOOTPROTO的值为“dhcp”,是否允许dhcp

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

           ifconfig:
                ifconfig eth0:0 192.168.137.31/24 up
            ip
                ip addr add 192.168.137.31/24 dev eth0:0
            查看网卡地址:
            [root@liu homework8]# ip addr show eth0
            2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 10
            00    link/ether 00:0c:29:45:cc:5e brd ff:ff:ff:ff:ff:ff
                inet 192.168.137.30/24 brd 192.168.137.255 scope global eth0
                inet 192.168.137.31/24 brd 192.168.137.255 scope global secondary eth0:0
                inet6 fe80::20c:29ff:fe45:cc5e/64 scope link 
                   valid_lft forever preferred_lft forever
            配置文件:
                ifcfg-eth0:0
                    DEVICE=eth0:0
            注意:网关别名不能使用dhcp协议引导;

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

        1)    ifconfig命令
                ifconfig [interface]
                    # ifconfig -a
                    # ifconfig IFACE [up|down]
                   ifconfig interface [aftype] options | address ...
                       # ifconfig IFACE IP/mask [up]
                       # ifconfig IFACE IP netmask MASK
                       注意:立即生效;
        2)  route命令
                   路由管理命令
                       查看:route -n
                       添加:route add
                           route add  [-net|-host]  target [netmask Nm] [gw Gw] [[dev] If]
                               目标:192.168.1.3  网关:172.16.0.1
                               ~]# route add -host 192.168.1.3 gw 172.16.0.1 dev eth0
                               目标:192.168.0.0 网关:172.16.0.1
                               ~]# route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 dev eth0
                               ~]# route add -net 192.168.0.0/24 gw 172.16.0.1 dev eth0
                               默认路由,网关:172.16.0.1
                               ~]# route add -net 0.0.0.0 netmask 0.0.0.0 gw 172.16.0.1
                               ~]# route add default gw 172.16.0.1
                       删除:route del
                           route del [-net|-host] target [gw Gw] [netmask Nm] [[dev] If]
                               目标:192.168.1.3  网关:172.16.0.1
                               ~]# route del -host 192.168.1.3
                               目标:192.168.0.0 网关:172.16.0.1
                               ~]# route del -net 192.168.0.0 netmask 255.255.255.0
        3)  netstat命令:
                       netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
                       显示网络连接:
                           netstat [--tcp|-t] [--udp|-u] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--extend|-e[--extend|-e]]  [--program|-p]
                               -t: tcp协议相关
                               -u: udp协议相关
                               -w: raw socket相关
                               -l: 处于监听状态
                               -a: 所有状态
                               -n: 以数字显示IP和端口;
                               -e:扩展格式
                               -p: 显示相关进程及PID
                               常用组合:
                                   -tan, -uan, -tnl, -unl
                       显示路由表:
                           netstat  {--route|-r} [--numeric|-n]
                               -r: 显示内核路由表
                               -n: 数字格式
                       显示接口统计数据:
                           netstat  {--interfaces|-I|-i} [iface] [--all|-a] [--extend|-e] [--program|-p] [--numeric|-n] 
                               # netstat -i
                               # netstat -I IFACE
        4)    ip命令:
            ip - show / manipulate routing, devices, policy routing and tunnels
            ip [ OPTIONS ] OBJECT { COMMAND | help }
                OBJECT := { link | addr | route }
            link OBJECT:
                ip link - network device configuration
                    set
                        dev IFACE
                        可设置属性:
                            up and down:激活或禁用指定接口;
                    show
                        [dev IFACE]:指定接口
                        [up]:仅显示处于激活状态的接口
                ip address - protocol address management
                    ip addr { add | del } IFADDR dev STRING
                        [label LABEL]:添加地址时指明网卡别名
                        [scope {global|link|host}]:指明作用域
                            global: 全局可用;
                            link: 仅链接可用;
                            host: 本机可用;
                        [broadcast ADDRESS]:指明广播地址
                    ip address show - look at protocol addresses
                        [dev DEVICE]
                        [label PATTERN]
                        [primary and secondary]
                    ip address flush - flush protocol addresses
                        使用格式同show
                ip route - routing table management
                    ip route add
                        添加路由:ip route add TARGET via GW dev IFACE src SOURCE_IP
                            TARGET:
                                主机路由:IP
                                网络路由:NETWORK/MASK
                            添加网关:ip route add defalt via GW dev IFACE
                    ip route delete
                        删除路由:ip route del TARGET 
                    ip route show
                    ip route flush
                        [dev IFACE]
                        [via PREFIX]
        5)    ss命令:
            格式:ss [OPTION]... [FILTER]
                选项:
                    -t: tcp协议相关
                    -u: udp协议相关
                    -w: 裸套接字相关
                    -x:unix sock相关
                    -l: listen状态的连接
                    -a: 所有
                    -n: 数字格式
                    -p: 相关的程序及PID
                    -e: 扩展的信息
                    -m:内存用量
                    -o:计时器信息
                    FILTER := [ state TCP-STATE ] [ EXPRESSION ]
            TCP的常见状态:
                tcp finite state machine:
                    LISTEN: 监听
                    ESTABLISHED:已建立的连接
                    FIN_WAIT_1
                    FIN_WAIT_2
                    SYN_SENT
                    SYN_RECV
                    CLOSED
                EXPRESSION:
                    dport = 
                    sport = 
                    示例:’( dport = :ssh or sport = :ssh )’
            常用组合:
                -tan, -tanl, -tanlp, -uan

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

        安装:
            rpm {-i|--install} [install-options] PACKAGE_FILE ...
                -v: verbose
                -vv: 
                -h: 以#显示程序包管理执行进度;每个#表示2%的进度
                rpm -ivh PACKAGE_FILE ...
                    [install-options]
                        --test: 测试安装,但不真正执行安装过程;dry run模式;
                        --nodeps:忽略依赖关系;
                        --replacepkgs: 重新安装;
                        --nosignature: 不检查来源合法性;
                        --nodigest:不检查包完整性;
                        --noscipts:不执行程序包脚本片断;
                            %pre: 安装前脚本; --nopre
                            %post: 安装后脚本; --nopost
                            %preun: 卸载前脚本; --nopreun
                            %postun: 卸载后脚本;  --nopostun
        升级:
            rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
            rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
                upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”;
                freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作;
                rpm -Uvh PACKAGE_FILE ...
                rpm -Fvh PACKAGE_FILE ...
                --oldpackage:降级;
                --force: 强行升级;
            注意:(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核;
                  (2) 如果原程序包的配置文件安装后曾被修改,长级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
        查询:
            rpm {-q|--query} [select-options] [query-options]
            [select-options]
                -a: 所有包
                -f: 查看指定的文件由哪个程序包安装生成
                -p /PATH/TO/PACKAGE_FILE:针对尚未安装的程序包文件做查询操作;
                --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供;
                --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖;
            [query-options]
                --changelog:查询rpm包的changlog
                -c: 查询程序的配置文件
                -d: 查询程序的文档
                -i: information
                -l: 查看指定的程序包安装后生成的所有文件;
                --scripts:程序包自带的脚本片断
                -R: 查询指定的程序包所依赖的CAPABILITY;
                --provides: 列出指定程序包所提供的CAPABILITY;
            用法:
                -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
                -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
                -qa
        卸载:
            rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts]
               [--notriggers] [--test] PACKAGE_NAME ...
        校验:
            rpm {-V|--verify} [select-options] [verify-options]
               S file Size differs
               M Mode differs (includes permissions and file type)
               5 digest (formerly MD5 sum) differs
               D Device major/minor number mismatch
               L readLink(2) path mismatch
               U User ownership differs
               G Group ownership differs
               T mTime differs
               P caPabilities differ

           
yum程序包管理:

        yum命令的用法:
        yum [options] [command] [package ...]
        显示仓库列表:
            repolist [all|enabled|disabled]
        显示程序包:
            list
                # yum list [all | glob_exp1] [glob_exp2] [...]
                # yum list {available|installed|updates} [glob_exp1] [...]
        安装程序包:
            install package1 [package2] [...]
            reinstall package1 [package2] [...]  (重新安装)
        升级程序包:
            update [package1] [package2] [...]
            downgrade package1 [package2] [...] (降级)
        检查可用升级:
            check-update
        卸载程序包:
            remove | erase package1 [package2] [...]
        查看程序包information:
            info [...]
        查看指定的特性(可以是某文件)是由哪个程序包所提供:
            provides | whatprovides feature1 [feature2] [...]
        清理本地缓存:
            clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
        构建缓存:
            makecache
        搜索:
            search string1 [string2] [...]
            以指定的关键字搜索程序包名及summary信息;
        查看指定包所依赖的capabilities:
            deplist package1 [package2] [...]
        查看yum事务历史:
            history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
        安装及升级本地程序包:
            * localinstall rpmfile1 [rpmfile2] [...]
               (maintained for legacy reasons only - use install)
            * localupdate rpmfile1 [rpmfile2] [...]
               (maintained for legacy reasons only - use update)
        包组管理的相关命令:
            * groupinstall group1 [group2] [...]
            * groupupdate group1 [group2] [...]
            * grouplist [hidden] [groupwildcard] [...]
            * groupremove group1 [group2] [...]
            * groupinfo group1 [...]

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

    用光盘当作本地yum仓库:
        (1) 挂载光盘至某目录,例如/media/cdrom
            # mkdir -pv /media/cdrom
            # mount -r -t iso9660 /dev/cdrom /media/cdrom
        (2) 创建配置文件
            [dvd]
            name = install dvd 
            baseurl = file:///media/cdrom
            enabled = 1
            gpgcheck = 0
        (3)清理本地缓存:
                make clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
            构建缓存:
                makecache
            或:yum repolist 重建仓库的元数据索引。

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

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

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

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

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

    #!/bin/bash
    #
    ls /etc/rc.d/rc3.d/K*|awk ‘{printf "%s Stop \n", $1}‘|awk -F‘/‘ ‘{print $NF}‘
    ls /etc/rc.d/rc3.d/S*|awk ‘{printf "%s Start \n", $1}‘|awk -F‘/‘ ‘{print $NF}‘
    k_lines=`ls /etc/rc.d/rc3.d/K*|awk ‘{print NR}‘|tail -1`
    s_lines=`ls /etc/rc.d/rc3.d/S*|awk ‘{print NR}‘|tail -1`
    echo "k start lines is $k_lines"
    echo "s start lines is $s_lines"

方案二:

    #!/bin/bash
    #
    declare -i k=0
    declare -i s=0
    dir_name="/etc/rc.d/rc3.d/"
     
    for list in $(ls $dir_name);do
      if echo $list | grep "^K*$" &> /dev/null;then
        echo "$list stop"
        let k++
      else
        echo "$list start"
        let s++
      fi
    done
    echo "kfile $k"
    echo "sfile $s"

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

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

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

    #!/bin/bash
    #
    declare -i sum=0
     
    if [ $# -eq 0 ];then
      echo "Usage: $0 User_name ..."
      exit
    fi
    for list in $*;do
      if id $list &> /dev/null;then
        user_id=$(id -u $list)
        let sum+=$user_id
      else
       echo  "$list is not exist"
      fi
    done
    echo "id total is $sum"

脚本测试:

    [root@liu homework8]# id -u user2
    3027
    [root@liu homework8]# id -u user4
    3029

    [root@liu homework8]# bash 13.sh user2
    id total is 3027
    [root@liu homework8]# bash 13.sh user2 user4
    id total is 6056

    

14、写一个脚本

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

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

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

    #!/bin/bash
    #
    declare -i dir_sum=0
    declare -i file_sum=0
    if [ $# -eq 0 ];then
        echo "Usage:$0 dir_name..."
    fi
    for list in $*;do
        if [ ! -d $list ];then
        echo "$list is not a directory,please input directory name" && exit 0
        fi
    done
    for list1 in $*;do
     for list2 in $(ls $list1);do
      if [ -d $list1/$list2 ];then
        let dir_sum++
       elif [ -f $list1/$list2 ];then
        let file_sum++
       fi
      done
    done
    echo "directory $dir_sum"
    echo "file $file_sum"
   测试脚本:   
    [root@liu homework8]# bash 14.sh /etc/sysconfig/network-scripts/ /var/log/
    directory 11
    file 85
    [root@liu homework8]# bash 14.sh /tmp/ /root/
    directory 22
    file 19

15、写一个脚本

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

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

    #!/bin/bash
    #
    if [ $# -ne 1 ];then
      echo "Usage: $0 user_name"
      exit 0
    fi
    if id $1 &> /dev/null;then
      num=$(id -u $1)
      if [ $num -gt 500 ];then
        echo "$1 is common user"
      fi
    fi
脚本测试:
    [root@liu homework8]# bash 15.sh user5
    user5 is common user
    [root@liu homework8]# bash 15.sh testuser1
    testuser1 is common user
    [root@liu homework8]# bash 15.sh root
    [root@liu homework8]#

16、写一个脚本

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

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

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

    #!/bin/bash
    #
    declare -i sum=0
    fun_adduser(){
     if [ $# -lt 1 ];then
      return 2
      # 2: no arguemnets
     fi
     if id $1 &> /dev/null;then
       echo "$1 is exists." && return 1
     else
      useradd $1 && echo $1 | passwd --stdin $1 &> /dev/null 
      [ $? -eq 0 ] && echo "Add $1 is finished." 
      let sum++
      return 0
     fi 
    }
    for i in {1..10};do
      fun_adduser myuser$i
    done
    echo "$sum users is added"
   测试脚本:
    [root@localhost scripttest]# bash 16.sh 
    Add myusers1 is finished.
    Add myusers2 is finished.
    Add myusers3 is finished.
    Add myusers4 is finished.
    Add myusers5 is finished.
    Add myusers6 is finished.
    Add myusers7 is finished.
    Add myusers8 is finished.
    Add myusers9 is finished.
    Add myusers10 is finished.
    10 users is added

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

    #!/bin/bash
    #
    net=‘192.168.137‘
    declare -i uphosts=0
    declare -i downhosts=0
    for i in {1..50};do
      ping -c 1 -w 1 $net.$i &> /dev/null
     if [ $? -eq 0 ];then
      echo -e "\033[32m $net.$i is up.\033[0m"
      let uphosts++
     else
      let downhosts++
     fi
    done
    echo "Up hosts: $uphosts."
    echo "Down hosts: $downhosts."
测试脚本:
    [root@liu homework8]# bash 17.sh 
     192.168.137.1 is up.
     192.168.137.2 is up.
     192.168.137.30 is up.
     192.168.137.32 is up.
    Up hosts: 4.
    Down hosts: 46.

18、打印九九乘法表;

    #!/bin/bash
    #
    #九九乘法表
    for j in $(seq 1 9);do
     for i in $(seq 1 $j);do
      echo -e -n "${i}X${j}=$[$i*$j]\t"
     done
     echo
    done
    #echo参数:-e 表示输出特殊字符\t(tab);-n 表示不换行输出。
测试脚本:
    [root@liu homework8]# bash 18.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


本文出自 “Ljohn” 博客,请务必保留此出处http://ljohn.blog.51cto.com/11932290/1860821

马哥2016全新Linux+Python高端运维班-Linux 网络基础管理,包管理,bash脚本练习