本周作业内容:

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

  • 网桥是早期的两端口二层网络设备,用来连接不同网段。网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机所取代。

  • 集线器的主要功能是对接收到的信号进行再生×××放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。集线器上各端口都是共享同一条背板总线的。不能隔离冲突域。工作在物理层。

  • 二层交换机是指只支持OSI第二层(数据链路层)交换技术的交换机,拥有MAC地址表,根据MAC地址进行转发。

  • 三层交换机就是具有部分路由器功能的交换机。三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。对于数据包转发等规律性的过程由硬件高速实现,而像路由信息更新、路由表维护、路由计算、路由确定等功能,由软件实现。传统交换技术是在数据链路层进行操作的,而三层交换技术是在三层实现了数据包的高速转发,既可实现网络路由功能,又可根据不同网络状况做到最优网络性能。

  • 路由器又称网关设备是用于连接多个网络,工作在三层,具有判断网络地址和选择IP路径的功能。


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

  • A类IP地址 

    A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.255.255.254。可用的A类网络有126个,每个网络能容纳1亿多个主机。 

  • B类IP地址 

    B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.254。可用的B类网络有16382个,每个网络能容纳6万多个主机。

  • C类IP地址 

    C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.254。C类网络可达209万余个,每个网络能容纳254个主机。

  • D类地址用于多点广播(Multicast) 

    D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。D类IP地址不标识网络,地址范围为224.0.0.0-239.255.255.255。

  • E类IP地址 

    以“llll”开始,为将来使用保留。 


全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。 

在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下: 

A类地址:10.0.0.0~10.255.255.254

B类地址:172.16.0.0~172.31.255.254

C类地址:192.168.0.0~192.168.255.254


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

OSITCP/IP物理设备
应用层(Application layer)应用层
表示层(Presentation layer)
会话层(Session layer)
传输层(Transport layer)传输层
网络层(Network layer)网络层路由器
数据链路层(Data link layer)
网络访问层(Network Access layer)
交换机
物理层(Physical layer)集线器


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

[root@captain network-scripts]# cat ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes   # 开机时启动
NM_CONTROLLED=no
BOOTPROTO=static  # 静态配置
IPv6INIT=no
IPADDR=192.168.1.100  # 指定IP地址
NETMASK=255.255.255.0  # 指定掩码

[root@captain network-scripts]# service  network restart
Shutting down interface eth0:  [  OK  ]
Shutting down interface eth1:  [  OK  ]
Shutting down loopback interface:  [  OK  ]
Bringing up loopback interface:  [  OK  ]
Bringing up interface eth0:  
Determining IP information for eth0... done.
[  OK  ]
Bringing up interface eth1:  Determining if ip address 192.168.1.100 is already in use for device eth1...
[  OK  ]

[root@captain network-scripts]# ip add show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:75:60:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth1
    inet6 fe80::20c:29ff:fe75:6088/64 scope link 
       valid_lft forever preferred_lft forever

#添加路由
[root@captain ~]# route add -net 192.168.2.0 netmask 255.255.255.0 dev eth1


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

a. 配置主机名,重启生效:/etc/sysconfig/network
    NETWORKING=yes  # 如果不为yes,则不启用网络功能
    HOSTNAME=captain  # 主机名。hostname临时修改,重启丢失。

b. 配置IP地址:/etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    TYPE=Ethernet
    ONBOOT=yes
    NM_CONTROLLED=no
    BOOTPROTO=dhcp

c. 修改hosts文件: /etc/hosts,用来把主机名字映射到IP地址的方法
    IP_address canonical_hostname [aliases...]

d. 域名服务器配置文件:/etc/resolv.conf,最多可以设置3行,前面的生效
    nameserver IP地址


e. 路由:可以把路由保存在文件,或者使用route add添加
1. 保存在文件:/etc/sysconfig/network-scripts/route-eth1
    192.168.2.0 via 192.168.1.254
2. 使用route add添加
    route add -net 192.168.2.0 netmask 255.255.255.0 dev eth1


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

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

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

[root@captain shell]# cat practice8_6.sh 
#!/bin/bash
. /home/shell/myfunctions

function pingIP()
{
    local ret;
    ping -c 3 -i 0.1 $1 >/dev/null 2>&1
    ret=$?
    if [ "$ret" -eq 0 ]; then
        echo -e "${Green}$1${EndColor} is up"
    else
        echo -e "${Red}$1${EndColor} is down"
    fi
}
for ip in 192.168.162.{1,2,3,4,134,135}
do
    pingIP $ip
done

[root@captain shell]# sh practice8_6.sh 
192.168.162.1 is down
192.168.162.2 is up
192.168.162.3 is down
192.168.162.4 is down
192.168.162.134 is up
192.168.162.135 is up


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

DEVICE=eth0      # 设备名称
TYPE=Ethernet    # 类型
ONBOOT=yes       # 开机启动
NM_CONTROLLED=no # 禁用NetworkManager
BOOTPROTO=dhcp   # dhcp方式或者IP地址

如果BOOTPROTO=static或者none  # 静态配置IP地址
IPADDR=IP地址
NETMASK=掩码
GATEWAY=网关


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

a. 通过命令配置
ifconfig eth0:0 192.168.2.100 netmask 255.255.255.0

b. 在/etc/sysconfig/network-scripts目录下,新建一个配置文件,如ifcfg-eth1:0
DEVICE=eth1:0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPv6INIT=no
IPADDR=192.168.3.100
NETMASK=255.255.255.0


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

常用命令有
a. ping 检测对端地址是否可达,如果对方禁ping,或者开启防火墙则不通。
    ping IP地址

b. ip 查看IP地址,设置网卡参数等
    ip addr 
    ip link show eth0
    
c. ifconfig 查看IP地址,设置IP地址等
    ifconfig eth0
    ifconfig eth1 192.168.1.100 netmask 255.255.255.0

d. ifup/ifdown 开启/关闭网卡
    ifdown eth0

e. route 添加、删除路由
    route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0
    
f. netstat 查看网络状态
    netstat -tunla  显示tcp,udp所有的监听的端口信息

g. ss 查看网络状态,统计信息等
    ss -tunla 显示tcp,udp所有的监听的端口信息

h. tcpdump 抓包工具
    tcpdump -vv 显示所有详细的报文信息

i. ethtool 查询或者修改网卡参数
    ethtool eth0 显示网卡eth0的属性信息


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

RedHat系列主要使用rpm,yum等
rpm常用参数
-i 安装软件包
-e 卸载软件包
-U 升级软件包
 --replacepkgs 重新安装某个软件包
-q 查询软件包
   a 查询所有软件包
   c 列出某个软件包所有配置文件
   d 列出某个软件包所有文档
   l 列出某个软件包所有文件
   f 查询某个文件所属软件包
--nodeps 不检查依赖
-v 显示详细信息

[root@captain ~]# rpm -qf /bin/ls
coreutils-8.4-37.el6.x86_64
[root@captain ~]# rpm -ql coreutils
/bin/arch
/bin/basename
/bin/cat
/bin/chgrp
/bin/chmod
/bin/chown
###### ommited #######
/usr/share/man/man1/who.1.gz
/usr/share/man/man1/whoami.1.gz
/usr/share/man/man1/yes.1.gz

[root@captain ~]# rpm -qa | grep core
coreutils-libs-8.4-37.el6.x86_64
coreutils-8.4-37.el6.x86_64
crash-gcore-command-1.0-5.el6.x86_64
redhat-lsb-core-4.0-7.el6.centos.x86_64


yum是基于rpm命令的交互式包管理器
list 列出可用软件包
repolist 列出可用仓库
install 安装某个软件包,自动解决依赖
remove 或者 erase 删除某个软件包,会删除与之相关的软件包,比较危险,不要使用此方法卸载软件包
search 搜索某个软件包
update 更新某个软件包,或者所有软件包
upgrade 同update,但不升级内核
clean 清空缓存数据

其它linux发行版,如Debian、ubuntu等使用apt-get、dpkg,SuSE使用rpm,zypper等。
另外,所有linux发行版都支持使用源码安装,主要步骤是
1. configure
2. make
3. make install


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

a. 挂载光盘
[root@captain conf]# mount /dev/sr0 /media/
mount: block device /dev/sr0 is write-protected, mounting read-only

b. 在/etc/yum.repos.d目录下新建repo文件,这里命名为localmedia.repo
[local-media]
name=Local-Media
baseurl=file:///media
gpgcheck=0
enabled=1

c. 清空cache,检查repository
[root@captain yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, security
Cleaning repos: local-media
Cleaning up Everything
Cleaning up list of fastest mirrors

[root@captain yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
repo id                        repo name                       status
local-media                    Local-Media                     6,518
repolist: 6,518


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

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

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

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

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

[root@captain shell]# cat practice8_12.sh 
#!/bin/bash

readonly workdir=/etc/rc.d/rc3.d
declare -i startswithK=0
declare -i startswithS=0

for filename in `ls -1 $workdir`
do
    case $filename in
    K*)
        echo $filename stop
        let startswithK++
        ;;
    S*)
        echo $filename start
        let startswithS++
        ;;
    *)
        ;;
    esac
done

echo "==========================================="
echo "The number of files that start with K: $startswithK"
echo "The number of files that start with S: $startswithS"

[root@captain shell]# sh practice8_12.sh 
K01numad stop
K01smartd stop
K02oddjobd stop
K10psacct stop
K10saslauthd stop
K15htcacheclean stop
K15httpd stop
K15mongod stop
K15nginx stop
K15nginx-debug stop
K35dhcpd stop
K35dhcpd6 stop
K35dhcrelay stop
K35dhcrelay6 stop
K35tgtd stop
K50netconsole stop
K50snmpd stop
K50snmptrapd stop
K50vsftpd stop
K60nfs stop
K61nfs-rdma stop
K69rpcsvcgssd stop
K73winbind stop
K75cgconfig stop
K75ntpdate stop
K75quota_nld stop
K76ypbind stop
K86cgred stop
K87named stop
K87restorecond stop
K88sssd stop
K89rdisc stop
K92ip6tables stop
K92iptables stop
K95rdma stop
K99rngd stop
S01sysstat start
S02lvm2-monitor start
S10network start
S11auditd start
S11portreserve start
S12rsyslog start
S13cpuspeed start
S13irqbalance start
S13rpcbind start
S14nfslock start
S15mdmonitor start
S19rpcgssd start
S20kdump start
S22messagebus start
S25blk-availability start
S25cups start
S25netfs start
S26acpid start
S26haldaemon start
S26udev-post start
S28autofs start
S50mcelogd start
S55sshd start
S56xinetd start
S58ntpd start
S80postfix start
S82abrt-ccpp start
S82abrtd start
S90crond start
S95atd start
S99certmonger start
S99local start
===========================================
The number of files that start with K: 36
The number of files that start with S: 32


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

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

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

[root@captain shell]# cat practice8_13.sh 
#!/bin/bash
. /home/shell/myfunctions

declare -i total=0
declare -i args=0

if [ "$#" -eq 0 ]; then
    echo "at least one argument!"
    exit 1
else
    args="$#"
fi

while [ "$args" -gt 0 ]
do
    if chkuser $1; then
        let "total += `id -u $1`"
    else
        echo "$1 does not exist, pass!"
    fi
    
    shift
    let args--
done

echo "The sum of ID: $total"

[root@captain shell]# sh  practice8_13.sh  visitor1 visitor7 visitor16 visitor77
visitor77 does not exist, pass!
The sum of ID: 9093


14、写一个脚本

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

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

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

[root@captain shell]# cat practice8_14.sh 
#!/bin/bash

if [ "$#" -eq 0 ]; then
    echo "at least one directory"
    exit 1
fi

declare -i dirs=0
declare -i files=0
declare -i idx=0
declare -ir args="$#"
declare -a dirlist

while [ "$idx" -lt "$args" ]
do
    if [ -d "$1" ]; then
        dirlist[$idx]=$1
    fi
    
    shift
    let idx++
done

function listfile(){
    for file in $1/*
    do
        if [ -d $file ]; then
            let dirs++
            echo $file
            listfile $file
        elif [ -f $file ]; then
            let files++
            echo $file
        fi
    done
}

for d in ${dirlist[*]}
do
    listfile ${d%/}
    echo "directories: $dirs"
    echo "files: $files"
    echo "===================="
done

[root@captain shell]# sh practice8_14.sh /tmp /dev/
/tmp/grub.conf
/tmp/md5_new1.list
/tmp/md5_new.list
/tmp/md5_old.list
/tmp/record
/tmp/srvs
/tmp/sysinit1
/tmp/temp
/tmp/temp/1.sh
/tmp/temp/ac
/tmp/temp/ac/abc
/tmp/temp/ac/file1
/tmp/temp/ac/file2
/tmp/temp/ac/file3
/tmp/temp/ac/file4
/tmp/temp/ac/file5
/tmp/temp/ac/file6
/tmp/temp/ac/file7
/tmp/temp/ad
/tmp/temp/ad/123
/tmp/temp/bc
/tmp/temp/bc/XYZ
/tmp/temp/bd
/tmp/temp/bd/789
/tmp/temp/file10
/tmp/temp/file11
/tmp/temp/file12
/tmp/temp/file13
/tmp/temp/file14
/tmp/temp/file15
/tmp/temp/file16
/tmp/temp/file17
/tmp/temp/file18
/tmp/temp/file19
/tmp/user
/tmp/yum_save_tx-2016-09-19-09-15fmyI1K.yumtx
directories: 5
files: 31
====================
/dev/block
/dev/bsg
/dev/bus
/dev/bus/usb
/dev/bus/usb/001
/dev/bus/usb/002
/dev/bus/usb/003
/dev/bus/usb/004
/dev/char
/dev/core
/dev/cpu
/dev/cpu/0
/dev/cpu/1
/dev/data
/dev/disk
/dev/disk/by-id
/dev/disk/by-label
/dev/disk/by-path
/dev/disk/by-uuid
/dev/fd
/dev/fd/255
/dev/hugepages
/dev/input
/dev/input/by-id
/dev/input/by-path
/dev/MAKEDEV
/dev/mapper
/dev/net
/dev/pts
/dev/raw
/dev/shm
/dev/snd
/dev/snd/by-path
/dev/VolGroup
directories: 36
files: 34
====================


15、写一个脚本

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

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

[root@captain shell]# cat practice8_14.sh 
#!/bin/bash

. /home/shell/myfunctions

if [ "$#" -ne 1 ]; then
    echo "Usage: `basename $0` username"
    exit 1
fi

if chkuser $1;then
    if [ `id -u $1` -ge 500 ]; then
    echo "normal user"
else
    echo "system user"
    fi
else
    echo "non-existent user"
fi

[root@captain shell]# sh practice8_14.sh  visitor7
normal user
[root@captain shell]# sh practice8_14.sh  root
system user
[root@captain shell]# sh practice8_14.sh  admin
non-existent user

  

16、写一个脚本

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

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

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

[root@captain shell]# cat practice8_16.sh 
#!/bin/bash

. /etc/init.d/functions
. /home/shell/myfunctions

declare -i usercnt=0

for user in user{1..10}
do
    if chkuser $user; then
        echo "$user exists!, pass"
    else
        useradd $user >/dev/null 2>&1
        ret=$?
        if [ "$ret" -ne 0 ]; then
            action "add user $user" /bin/false
        else
            echo "$user" | passwd --stdin $user > /dev/null 2>&1
            let usercnt++
            action "add user $user" /bin/true
        fi
    fi
done

echo "$usercnt user(s) added"

[root@captain shell]# sh practice8_16.sh 
add user user1 [  OK  ]
add user user2 [  OK  ]
add user user3 [  OK  ]
add user user4 [  OK  ]
add user user5 [  OK  ]
add user user6 [  OK  ]
add user user7 [  OK  ]
add user user8 [  OK  ]
add user user9 [  OK  ]
user10 exists!, pass
9 user(s) added

   

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

略,同第6题。


18、打印九九乘法表;

[root@captain shell]# cat practice8_18.sh 
#!/bin/bash
for ((i = 1; i <= 9; i++))
{
    for ((j = 1; j <= i; j++))
    {
        let "k = i * j"
        echo -n "${i}x${j}=$k "
    }
    echo
}

[root@captain shell]# sh practice8_18.sh 
1x1=1 
2x1=2 2x2=4 
3x1=3 3x2=6 3x3=9 
4x1=4 4x2=8 4x3=12 4x4=16 
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81