linux运维实战练习-2016年1月19日-2月3日课程作业(练习)

 1、描述centos6系统开机启动流程;

    (1):首先按下开机按钮,POST:电源加电,计算机通过BIOS来调用CMOS中各个硬件设备的配置信息。

    CMOS:CMOS是集成在主板上的一块可读写的RAM芯片,主要是用来保存当前系统硬件配置和操作人员对某些参数的设定,由于主板给CMOS提供也一块单独供电的电池,所以无论系统是关机还是突然断电,CMOS的设定是不会丢失的。

    BIOS:由于CMOS芯片只是一块存储器,只具有保存数据的功能,所以计算机厂商把CMOS设置程序做到了BIOS里面,开机按下特定的按钮就能进入其中进行查看和设置,所以CMOS设置人们也叫做BIOS设置。

    (2):BIOS会执行开机自检,然后开始执行硬件检测和初始化,之后BIOS根据boot Sequence按次序查找各引导设备有没有MBR,第一个找到MBR的设备即为本次启动要用到的设备

    MBR:MBR即主引导记录,硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT和分区有效标志。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是分区表,即DPT,占64个字节。第三部分是magicnumber,占2个字节。

    (3):读取并执行第一个启动设备内MBR的bootLoader(即grub等程序)。

    GRUB:他的作用提供一个菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核;

    GRUB分为三个阶段:stage 1,stage1.5, stage 2

    当进入系统秒读的时候,按下任意键就能进入GRUB选择菜单界面,如下图

                             

linux运维实战练习-2016年1月19日-2月3日课程作业(练习)_第1张图片


    提示按下e健可以进入编辑模式,如下图

linux运维实战练习-2016年1月19日-2月3日课程作业(练习)_第2张图片

    方框内第一行代表boot目录所在的位置,此处为第一个磁盘第一个分区,

    方框内第二行表示内核所在位置以及版本号

    方框内第三行是一个虚拟文件系统,可通过这个文件系统可找到根分区位置 以方便内    核找到根分区、init程序、以及必要的驱动程序、库文件

    在这个见面中,选择一个选项按下e健,表示对你选择的选项进行修改,比如选择第一    行如下图:

linux运维实战练习-2016年1月19日-2月3日课程作业(练习)_第3张图片

    在图一和图二界面中直接按下c健可以直接进入GRUB命令行界面,这里可以手动指定内核和initrd。

    (4)GRUB通过GRUB2找到内核,GRUB将CPU的控制权交给内核,CPU将控制器转交给内核,内核首先进行自身初始化,包括探测可识别到的所有硬件设备;加载硬件驱动程序;(有可能会借助于ramdisk加载驱动);以只读方式挂载根文件系统;运行用户空间的第一个应用程序:/sbin/init;

    因为kernel无法识别磁盘,所以要借助ramdisk(虚拟文件系统)的获取磁盘的驱动程序。CentOS 6中的虚拟文件系统是initramfs,内核通过该程序加载启动过程中所需要的内核模块,也就是USB,RAID,LVM。SCSI等文件系统与硬盘接口的驱动程序,等加载完成之后,内核就会调用/sbin/init来开始后续的正常启动流程

    (5)调用/sbin/init程序

    /sbin/init最主要的功能就是主板软件执行的环境,其配置文件是/etc/inittab和/etc/init/*.conf

    /etc/inittab:这里面定义了系统启动的执行等级,系统初始化流程的文件,七个运行等级需要启动的服务路径;

    run level 运行等级:

        init 0:表示关机

        init 1:单用户模式(root, 无须登录),系统出问题时的维护

        init 2:多用户模式,会启动网络功能,但不会启动NFS

        init 3:多用户模式,纯文本界面;

        init 4:预留级别;

        init 5:多用户模式,图形界面;

        init6:表示重启

    id:3:initdefault:        表示默认开机级别为3,自动进入命令行界面

    si::sysinit:/etc/rc.d/rc.sysinit   系统初始化环境执行的脚本文件路径

    七个不同级别要启动的script路径

    l0:0:wait:/etc/rc.d/rc 0

    l1:1:wait:/etc/rc.d/rc 1

    l2:2:wait:/etc/rc.d/rc 2

    l3:3:wait:/etc/rc.d/rc 3

    l4:4:wait:/etc/rc.d/rc 4

    l5:5:wait:/etc/rc.d/rc 5

    l6:6:wait:/etc/rc.d/rc 6

    (6)系统初始化

        (a)      设置主机名

        (b)      设置欢迎界面

        (c)      激活udev和selinux 

        (d)      挂载/etc/fstab文件中定义的文件系统

        (e)      检测根文件系统,并以读写方式重新挂载根文件系统

        (f)      设置系统时钟

        (g)      激活swap设备

        (h)      根据/etc/sysctl.conf文件设置内核参数

        (i)      激活lvm及software raid设备(硬raid是在开机时启动的)

        (j)  加载额外设备驱动程序

        (k)  清理操作

    (7)执行 /etc/rc.d/rc 脚本

            此脚本用来来控制系统启动的时候启动或者关闭那些服务,这些脚本是否开机自启动,可由 chkconfig 命令来管理。

    (8)最后会执行 /bin/login 登录用户。至此系统启动过程完成。

 

 2、描述/etc/rc.d/rc.sysinit脚本功能;

    (1)、获取主机名,读取/etc/sysconfig/network配置文件,获取主机的默认网关的网络环境

    (2)、测试与挂在内核设备/proc记忆USB设备/sys,如果有USB设备则会主动加载USB设备的驱动程序,并且挂在USB的文件系统

    (3)、是否启动SELinux

    (4)、启动系统的随机数生成器,随机数生成器可以帮助系统进行一些密码演算的功能,在此需要启动两次随机数生成器。

    (5)、设置屏幕的默认字体

    (6)、设置启动是的欢迎界面

    (7)、设置系统时间和时区

    (8)、设备接口的检测

    (9)、用户自定义模块的加载

        用户可在/etc/sysconfi.modules/*.modules中加入自定义的模块

    (10)、加载内核相关信息

        系统会主动读取/etc/sysctl.conf配置文件里面的设置值

    (11)、设置主机名和初始化电源管理模块

    (12)、初始化软件磁盘阵列,主要通过/etc/mdadm.conf来设置

    (13)、初始化LVM的文件系统功能

    (14)、以fsck检测磁盘文件系统

    (15)、重新以可读写模式挂载系统磁盘

    (16)、启动quota(显示磁盘使用情况和配额)功能,

    (17)、启动系统伪随机数生成器

    (18)、清楚系统启动过程的临时文件

    (19)、将启动相关信息加载/va/log/dmesg文件中

   

 3、总结文本处理工具sed及awk的用法;(必须附带示例)

    这里以/data/sed.test文件为例

    cat /data/sed.test

    Hello word!

    My name is LouIS

    Never forget to say “thanks”.

    Believe in yourself.

    I can because i think i can.

    Never say die.

 

 

sed:

    sed是一个行编辑器,他不会编辑原文件,而是一次读取一行到sed自己的缓存空间,这个缓存空间叫做模式空间,sed在模式空间完成编辑之后,将编辑之后的内容打印至屏幕或者指向目标文件,他不做原地编辑。如果不是删除命令,大多数编辑的内容都会打印至屏幕。

    sed还有一个保持空间,前一个sed编辑没有完成要处理下一个sed编辑,把之前一个保存在sed的保持空间里。

    语法格式:sed [OPTION]... ‘sed脚本’ inputfile...

    [OPTION]: 常用选项

        -n:静默模式,默认sed会输出模式空间里面的内容,-n是不输出模式空间类容至屏幕,除非单独指定的类容

        -e:多点编辑功能,在一个sed命令实现过个编辑操作

        -f:-f/path/to/script_file:从指定文件中读取编辑脚本

        -r:支持使用扩展的正则表达式

        -i:原处编辑,就是修改原文件

    地址定界原理:

        1、不给地址:对全文进行处理

            如果不给指定的行,或者范围,sed命令将对全文进行处理

        2、只给一个地址:单地址

            #:数字,指定的行

                这个地方指数字,代表行

            /pattern/:被此处模式所能够匹配到的每一行

                这里表示匹配的字符串所在的行

 

        3、地址范围:

            #,#

                指定行之间,例如1,5 表示第一行到第五行

            #,+#

                例如:1,+3表示第一行到加上3的行数之间

        4、~步进

            1~2,显示基数行

            2~2,显示偶数行

 

    sed脚本的编辑子命令

        1、d:表示删除给定的行

            示例:

            删除/data/sed.test文件中以Never开头的行                                       

[root@localhost data]# sed'/^Never/d' /data/sed.test
                Helloword!
                Myname is LouIS
                Believein yourself.
                I can because i think i can.


 

            删除/data/sed.test文件中第2行

          

  [root@localhostdata]# sed '2d' /data/sed.test
            Helloword!
            Neverforget to say “thanks”.
            Believein yourself.
            Ican because i think i can.
            Never say die.


 

            删除/data/sed.test文件中第2-5行

          

  [root@localhostdata]# sed '2,5d' /data/sed.test
            Helloword!
            Never say die.


 

        2、p:显示模式空间中匹配到的行的内容

            示例:

           

 sed '/^root/p' /data/sed.test
            [root@localhostdata]# sed '/^Never/p' /data/sed.test
            Helloword!
            Myname is LouIS
            Neverforget to say “thanks”.
            Neverforget to say “thanks”.
            Believein yourself.
            Ican because i think i can.
            Neversay die.
            Never say die.


            这个命令显示文件所有内容,并且把匹配到的行打印两遍,因为他是打印命令,不过不知名需要打印内容,默认全部显示,所以p命令一般跟-n参数一起使用

          

  [root@localhostdata]# sed -n '/^Never/p' /data/sed.test
            Neverforget to say “thanks”.
            Never say die.


    3、a :追加文本之符合条件行的下一行,支持多行追加  格式:a \text

        示例:

            在/data/sed.test文件中Never开头的行下面追加Long live China

         

  [root@localhostdata]# sed '/^Never/a \Long live China' /data/sed.test 
           Helloword!
           Myname is LouIS
           Neverforget to say “thanks”.
           Longlive China
           Believein yourself.
           Ican because i think i can.
           Neversay die.
           Long live China


    4、i:在符合条件行的上一行添加一行,支持多行添加   格式:i \text

       示例

           在/data/sed.test文件中Never开头的行上面面追加Long live China

       

    sed '/^Never/i \Long live China' /data/sed.test
           [root@localhost~]# sed '/^Never/i \Long live China' /data/sed.test
           Helloword!
           Myname is LouIS
           Longlive China
           Neverforget to say “thanks”.
           Believein yourself.
           Ican because i think i can.
           Longlive China
           Never say die.


    5、c:把符合条件的行替换成指定的行,支持多行替换 格式:c \text

       示例:

           把/data/sed.test文件中以Never开头的行替换成Long live China

         

  [root@localhost~]# sed '/^Never/c \Long live China' /data/sed.test
           Helloword!
           Myname is LouIS
           Longlive China
           Believein yourself.
           Ican because i think i can.
           Long live China


    6、w:把符合条件内容的行另存为指定文件中  格式:w /path/to/some

       示例:

       把/data/sed.test文件以Never开头的行另存为/data/sed.test1里面

      

 [root@localhost data]# sed -n '/^Never/w /data/sed.test1'/data/sed.test
       [root@localhostdata]# cat /data/sed.test1
       Neverforget to say “thanks”.
       Never say die.


      

    7、r:读取指文件的内容,放置符合条件行的后面 格式:r /path/to/some

       示例:

       把/etc/sysconfig/network-scripts/ifcfg-eth0文件内容放置/data/sed.test文件中以Never开头行的后面

     

  [root@localhostdata]# sed '/^Never/r /etc/sysconfig/network-scripts/ifcfg-eth0' /data/sed.test
       Helloword!
       Myname is LouIS
       Neverforget to say “thanks”.
       DEVICE=eth0
       HWADDR=00:0C:29:E7:CA:5F
       TYPE=Ethernet
       UUID=5004c3f9-33d7-42e9-9e6d-5a947988174d
       ONBOOT=yes
       NM_CONTROLLED=yes
       BOOTPROTO=dhcp
       Believein yourself.
       Ican because i think i can.
       Neversay die.
       DEVICE=eth0
       HWADDR=00:0C:29:E7:CA:5F
       TYPE=Ethernet
       UUID=5004c3f9-33d7-42e9-9e6d-5a947988174d
       ONBOOT=yes
       NM_CONTROLLED=yes
       BOOTPROTO=dhcp


 

    8、=:显示符合条件行的行号

       显示/data/sed.test文件有Never字符串行的行号

      

      

 [root@localhostdata]# sed '/Never/=' /data/sed.test
       Helloword!
       Myname is LouIS
       3
       Neverforget to say “thanks”.
       Believein yourself.
       Ican because i think i can.
       6
       Never say die.


       只显示行号则可以加上-n参数

 

    9、!:取反条件,他是对地址定界去反

       示例:

       删除/data/sed.test文件中不是以Never开头的所有行

      

 [root@localhostdata]# sed '/^Never/!d' /data/sed.test
       Neverforget to say “thanks”.
       Never say die.


    10、s:查找和替换

       格式:s/原内容/替换后的内容/  也可以是用其他分隔符@@@,###等

       把/data/sed.test内容中Never字符删了

      

 [root@localhostdata]# sed 's#Never##' /data/sed.test
       Helloword!
       Myname is LouIS
       forget to say “thanks”.
       Believein yourself.
       Ican because i think i can.
       saydie.


       把/data/sed.test内容中name改为大写

     

  [root@localhostdata]# sed 's@name@NAME@' /data/sed.test
       Helloword!
       MyNAME is LouIS
       Neverforget to say “thanks”.
       Believein yourself.
       Ican because i think i can.
       Never say die.


       把/data/sed.test内容Never字符串后面加空格和China

       

 [root@localhostdata]# sed 's/Never/& China/' sed.test
        Helloword!
        Myname is LouIS
        NeverChina forget to say “thanks”.
        Believein yourself.
        Ican because i think i can.
        Never China say die.


        &表示原内容

 

    sed高级编辑命令:

       h:把模式空间中的内容行覆盖至保持空间中,保持空间的内容行会丢失

       H:把模式空间中的内容行追加至保持空间中,保持空间的内容行不会丢失

       g:从保持空间取出内容行覆盖至模式空间

       G:从保持空间取出内容行追加至模式空间

       x:把模式空间的内容行与保持空间的内容行进行互换

       n:读取匹配到行的下一行至模式空间

       N:追加匹配到行的下一行至模式空间

       d:删除模式空间中的行,

        D:删除多行模式空间中的所有行

 

    一些表达式

        sed-n 'n;p' /etc/passwd    显示偶数行

        sed '1!G;h;$!d' /etc/passwd   逆向显示文件内容

        sed'$!N;$!D' /etc/passwd  显示文件后两行

       sed '$!d' /etc/passwd想・  显示文件最后一行

       sed 'G' /etc/passwd  在每一行后面添加空白行

       sed 'g' /etc/passwd  所有行都用空白代替

       sed '/^$/d;G' /etc/passwd  在每一行添加一个空白行,多个空白行合并成一个空白行

       sed 'n;d' /etc/passwd   显示基数行

        sed -n '1!G;h;$p' /etc/passwd  逆向显示文件内容

 

awk

    awk是一个强大的文本分析工具, 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.

    awk有三个版本,一般未做说明的默认是gawk,也就是GNU版本的awk,在linux上使用awk默认就是gawk,awk是个符号连接,指向gawk。

    基本用法:awk [option] 'program' FILE...

    option:选项

        -F:指明分隔符,如果不知名默认分隔符是空白字符

        -v:var=value自定义变量

    program:awk语句

        pattern:模式,(后面再说)

        action:动作

            print:打印

            printf:格式化打印

 

    输出命令:

        1、print:打印

            格式:print item1,itme2...

            print后面接字段item,这些item可以是数值也可以是字符串,变量或awk的表达式,多个字段要用都好隔开,如果不指定字段,默认全文打印。

            示例:

            打印/etc/passwd文件中第一字段和第四字段

         

   awk -F: '{print $1,$4}' /etc/passwd
            root0
            bin1
            daemon2
            adm3
            lp 4
            ...


        2、变量

            2.1、内建变量

                FS:input field seperator 默认为空白字符

                    输入时使用的字段分隔符,也就是文件中要使用什么作为字段分隔的字符

                显示/etc/passwd中第一字段和第六字段

               

 awk -v FS=':' '{print $1,$6}' /etc/passwd,和-F的意思差不多
                root/root
                bin/bin
                daemon/sbin
                adm/var/adm
                lp /var/spool/lpd


 

                OFS:output field seperator 默认为空白字符

                    输出时使用的字段分隔符,输入至屏幕时用什么分隔符来分隔字段

                显示/etc/passwd中第一字段和第六字段,并且用冒号分割输出内容

              

  awk -v FS=':' -v OFS=':' '{print $1,$6}' /etc/passwd
                root:/root
                bin:/bin
                daemon:/sbin
                adm:/var/adm
                lp:/var/spool/lpd


 

                RS:input record seperator

                    输入时的换行符

                ORS:output record seperator

                    输出时的换行符

                NF:number of field 默认分隔符为空白

                    每一行的字段数量

                查看/etc/passwd每一行的字段数量

               

 awk -F: '{print NF}' /etc/passwd cord
                7
                7
                7
                7
                7
                NR:number of record

   

                    文件中的行数

               

awk '{print NR}' /etc/passwd
                1
                2
                3
                4
                5
                6
                ....


               

                FNR:各文件分别计数,后面可以接不同文件

                FILENAME:当前正在处理的文件的文件名

           

     awk -F: '{print FILENAME }' /etc/passwd


                ARGC:命令行参数的个数

              

  awk -F: '{print ARGC}' /etc/passwd


                ARGV:数组,保存的是命令行所给定的各参数,

                    查看你输入命令中参数,要用ARGV[0|1|2...]来实现

           

     awk '{print ARGV[0]}' /etc/passwd
                awk
                awk
                ....


 

            2.2、自定义变量

                2.2.1、-v var=value变量名区分字符大小写

                (2)在program中直接定义

 

        3、printf命令  

            安装给定的格式输出匹配到的字段内容

            格式:printf FORMAT,item1,item2...

            3.1、FORMAT必须给出

            3.2、printf不会自动换行,需要显示给出换行控制符:\n

            3.4、FORMAT中需要分别给后面的每个item指定一个格式化符号

            格式符:

                %c:显示字符的ASCII码

                %d,%i:显示十进制整数

                %e,%E:科学计数法数值显示

                %f,显示浮点数

                %g,%G:以科学计数法或浮点形式显示数值

                %s: 显示字符串

                %u:无符号整数

                %%:显示%自身

            修饰符:是来修饰格式符的

                #[.#]: 第一个数字用来控制显示的宽度,第二个字符表示小数点后的精度

                    3.1f

                -: 左对齐

                +:显示数值的符号

 

            示例:

          

  1、awk -F ':' '{printf "Username: %s\n",$1}' /etc/passwd    
            Username:root
            Username: bin
            Username: daemon
            Username: adm
            ...
            如果不给换行符:\n,显示内容如下:
            Username: rootUsername: binUsername: daemonUsername:admUsername: lpUsername: syncUsername:        shutdownUsername: haltUsername:mailUsername: uucpUsername: operatorUsername: gamesUsername:        gopherUsername:ftpUsername: nobodyUsername: dbusUsername: usbmuxdUsername: vcsaUsername:           rpcUsername:rtkitUsername: avahi-autoipdUsername: abrtUsername: rpcuserUsername:               nfsnobodyUsername: haldaemonUsername:gdmUsername: ntpUsername: apacheUsername:                 saslauthUsername: postfixUsername:mysqlUsername: pulseUsername: sshdUsername: tcpdump


        默认是不带换行的,所以必要的时候一定要加换行符

      

  2、awk -F ':' '{printf"Username: %15s, UID: %d\n",$1,$3}' /etc/passwd
                Username:            root, UID: 0
                Username:             bin, UID: 1
                Username:          daemon, UID: 2
                Username:             adm, UID: 3   
                 默认是做对齐,如果要由对齐,如下
                awk -F ':' '{printf"Username: %-15s, UID: %d\n",$1,$3}' /etc/passwd
                Username: root           , UID: 0
                Username: bin            , UID: 1
                Username: daemon         , UID: 2
               Username: adm            , UID: 3
                Username: lp             , UID: 4


 

    4、操作符

                算术操作符:

                    x+y,x-y,x*y,x/y,x^y,x%y

                    -x

                    +x: 转换为数值

 

                字符串操作符:没有符号操作符,表示字符串连接

 

                赋值操作符:

                    =,+=,-=,*=,/=,%=,^=

                    ++,--

 

                比较操作符:

                    >,>=,<,<=,!=,==

 

                模式匹配符:

                    ~:左侧字符串是否能被右侧模式匹配

                    !~:相反

 

                逻辑操作符:

                    &&:与

                    ||:或

                    !:非

 

                函数调用:

                   function_name(argu1,argu2...)

 

                条件表达式:

                   selector?if-true-expression:if-flse-expression

            示例:

                判断是否是系统用户

            

    awk -F ':''{$3>=500?usertype="Common User":usertype="Sysadmin orSysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
 
           root:Sysadmin or SysUser
            bin:Sysadmin or SysUser
        daemon:Sysadmin or SysUser
            adm:Sysadmin or SysUser
             lp:Sysadmin or SysUser


 

        5、PATTERN

            5.1、empty:空模式,匹配每一行,以上示例用的都是这个模式

 

            5.2、/regular expression/: 仅处理能够被此处模式匹配到的行

                示例:仅处理root开头的行

             

   awk '/^root/{print $1}'/etc/passwd  
                root:x:0:0:root:/root:/bin/bash


                还可以取反

              

  awk '!/^root/{print $1}'/etc/passwd
                bin:x:1:1:bin:/bin:/sbin/nologin
                daemon:x:2:2:daemon:/sbin:/sbin/nologin
                adm:x:3:4:adm:/var/adm:/sbin/nologin
                lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
                sync:x:5:0:sync:/sbin:/bin/sync
                    ....


           

            5.3、relational expression:关系表达式,结果有真有假

                结果为真才被处理,结果为假被过滤掉

                真:结果为非0值,非空字符串

                假:1,空字符串

               

                示例:

                    判断用户是否是系统用户

               

     awk -F: '$3>=500{print$1,$3}' /etc/passwd
                    nfsnobody 65534
                    user1 500
                    user2 501
                    user3 502
                    user4 503
                    user5 504
                    user6 505
                    user7 506
                    user8 507
                    user9 508
                    user10 509


                    显示shell为/bin/bash的用户名

                

    awk -F: '$NF=="/bin/bash"{print$1,$NF}' /etc/passwd 或
                    awk -F: '$NF~/bash$/{print$1,$NF}' /etc/passwd
                    root /bin/bash
                    mysql /bin/bash
                    user1 /bin/bash
                    user2 /bin/bash
                   user3 /bin/bash
                    user4 /bin/bash
                    user5 /bin/bash
                    user6 /bin/bash
                    user7 /bin/bash
                    user8 /bin/bash
                    user9 /bin/bash
                    user10 /bin/bash


       

       

        5.4、line ranges:行范围

            /pat1/,/pat2/  只支持字符串格式,

            注意:不支持直接给出数字的格式

            示例:

            以root开头行开始到以tcp开头的行结束

        

    awk -F: '/^root/,/^tcp/{print $1}'/etc/passwd或
            awk -F: '(NR>=2&&NR<=10){print$1}' /etc/passwd


 

        5.5、BEGIN/DEN模式

           BEGIN{}:仅在开始处理文件中的文本之前执行一次

           在执行我们处理之前给出一个模式,他只执行一次,后面跟着执行的内容

           示例

         

  awk -F: 'BEGIN{print "     username     uid   \n--------------------"}{print $1,$3}' /etc/passwd


           END{}:仅在文件处理完成之后执行一次

        

   awk -F: 'BEGIN{print "     username     uid   \n--------------------"}{print $1,$3}END{print"==================\n end      "}' /etc/passwd


           这个有点自定义格式的意思

 

        6、常用的action

                6.1、Expressions

                6.2、Control statements:if,while等

                6.3、Conpound statements:组合语句:

                6.4、input statements 输入语句

                6.5、output statements 输出语句



 4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2中方法);

    [root@localhost data]# vim paixu1.sh
    #!/bin/bash
    for ((for i=1; i<=10; i++)); do
        echo $RANDOM
    done | sort -n
    [root@localhost data]# bash -n paixu1.sh
    [root@localhost data]# bash paixu1.sh
    2771
    5516
    10587
    14848
    17526
    22253
    22798
    23120
    27576
    32670

   

 5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;

   

 [root@localhost data] 5 1 * * 2 /data/get_username.sh >>/tmp/get_username.log


   

 6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;

    [root@localhost data]# vim directroy .sh
    #!/bin/bash
    read -p 'Enter a directroy:' directroy
    if [ !-e "$directroy" ]; then
        mkdir -r $directroy
    else
            echo "$directroy is existence"\n
        ll -d $directroy \n
        ls
    fi
    [root@localhost data]# bash -n directroy.sh
    [root@localhost data]# bash directroy.sh
    Enter a directroy: /data
    /data is existencen
    drwxr-xr-x. 2 root root 4096 1月  2922:00 /data
    99for.sh    cjuser.sh    ml.txt    passwd     passwd.sed  ping.sh  sed.test  text.txt
    99while.sh  directroy.sh  o ai menglei passwdlist  ping2.sh    plt.txt  sed.test1 userlist
    [root@localhost data]# [root@localhost data]# bash directroy.sh
    Enter a directroy: /panlitao/LouIs
    /panlitao/LouIs create success
    [root@localhost data]# ls /
    bin   data  etc  lib    lost+found  misc net  panlitao  root  selinux sys  usr
    boot  dev   home lib64  media       mnt  opt  proc      sbin srv      tmp  var
    [root@localhost data]# ls /panlitao
    LouIs


 

 7、写一个脚本,打印9X9乘法表;

 

   [root@localhost data]#vim 99for.sh
    #!/bin/bash
    for j in [1..9]; do
        for i in $(seq 1 $j); do
            echo -e -n "${i}X${j}=$[$i*$j]\t"
        done
        echo
    done
    [root@localhost data]#bash -n 99for.sh
    [root@localhost data]#bash 99for.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

 8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。

工作流程:


Client(请求) --> hosts文件 --> DNS Server(recursion) 

                Local Cache(本地缓存) --> DNS Server(递归)--> Server Cache(服务缓存) --> iteration(迭代)--> 根 --> 顶级域 --> 二级域 --> 三级域 --> ......

            首先无论是Linux或者Windows,客户端发起请求,系统不会第一个请求DNS服务器,而是查找hosts文件,如果hosts文件没有请求的内容,他就会请求DNS服务器,DNS服务器首先会去查找本地DNS服务器的缓存,缓存也没有结果就会请求自己定义的主DNS服务器,而主DNS服务器也不会直接立即把请求转发出去,而是转给Server自己的缓存,如果里面还没有的话才会把请求转发出,做迭代处理。


服务器搭建

正向解析

1、配置缓存名称服务器

主要是修改主配置文件:/etc/named.conf

[root@CentOS6 named]#cp /etc/named.conf /etc/named.conf.bat
[root@CentOS6 named]#vim /etc/named.conf
options {
        listen-on port 53 { 127.0.0.1; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";     
        dump-file       "/var/named/data/cache_dump.db";    
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; };
        recursion yes;
        dnssec-enable yes;
        dnssec-validation yes;
        dnssec-lookaside auto;
        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
        managed-keys-directory "/var/named/dynamic";
};
logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
zone "." IN {
        type hint;
        file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";




更改内容:

第一部分:

listen-on port 53 { 127.0.0.1; };

listen-on port 53 { 192.168.0.105; 127.0.0.1; };


第二部分:

dnssec-enable yes;

dnssec-validation yes;

dnssec-lookaside auto;

bindkeys-file "/etc/named.iscdlv.key";

managed-keys-directory "/var/named/dynamic";

这些内容注释掉


第三部分:

allow-query     { localhost; };

allow-query     { any; };  或者注释掉



2、配置主DNS服务器

(1)、在缓存名称服务器中添加自定义zone

[root@CentOS6 named]#vim /etc/named.rfc1912.zone
zone "hongying.com" IN {
    type master;
    file "hongying.com.zone"
};

检查语法:named-checkconf

(2)、定义区域解析库文件

[root@CentOS6 named]#cd /var/named
[root@CentOS6 named]#vim hongying.com.zone   创建一个文件
$TTL 86400
$ORIGIN hongying.com.
@INSOAns1.hongying.com. admin.hongying.com (
201602052200
1H
5M
7D
1D )
INNSns1
INNSns2
INMX  10  mx1
IN      MX  20  mx2
ns1INA192.168.0.105
ns2     IN      A       192.168.0.106
mx1     IN      A       192.168.0.107
mx2     IN      A       192.168.0.108 
www     IN      A       192.168.0.105


检查语法:

[root@CentOS6 named]# named-checkzone "hongying.com" /var/named/hongying.com.zone 
zone hongying.com/IN: loaded serial 4033556584
OK
更改权限,不允许其他用户访问解析库文件:
[root@CentOS6 named]# chmod 640 hongying.com.zone
在把属组改回来:
[root@CentOS6 named]# chown :named hongying.com.zone
重启服务:
[root@CentOS6 named]# service named restart
停止 named:                              [确定]
启动 named:                              [确定]

测试解析:

[root@CentOS6 named]#dig -t A www.hongying.com @192.168.0.105
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.6 <<>> -t A www.hongying.com @192.168.0.105
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16832
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;www.hongying.com.INA
;; ANSWER SECTION:
www.hongying.com.86400INA192.168.0.105
;; AUTHORITY SECTION:
hongying.com.86400INNSns1.hongying.com.
hongying.com.86400INNSns2.hongying.com.
;; ADDITIONAL SECTION:
ns1.hongying.com.86400INA192.168.0.105
ns2.hongying.com.86400INA192.168.0.106
;; Query time: 0 msec
;; SERVER: 192.168.0.105#53(192.168.0.105)
;; WHEN: Fri Feb  5 05:22:47 2016
;; MSG SIZE  rcvd: 118

向解析

第一步:添加自定义zone

[root@CentOS6 named]#vim /etc/named.rfc1912.zone
zone "0.168.192.in-addr.arpa" IN {
        type master;
        file "192.168.0.zone";
};

检查语法:named-checkconf

第二步:创建反向区域解析库

[root@CentOS6 named]#cd /var/named
[root@CentOS6 named]#vim -o hongying.com.zone 192.168.0.zone   根据正向解析库内容创建一个反向解析库文件192.168.0.zone
$TTL 86400
$ORIGIN 0.168.192.in-addr.arpa.
@INSOAns1.hongying.com. admin.hongying.com. (
201602052200
1H
5M
7D
1D )
INNSns1.hongying.com.
INNSna2.hongying.com.
11INPTRns1.hongying.com.
11INPTRwww.hongying.com.
12INPTRmx1.hongying.com.
12INPTRwww.hongying.com.
13INPTRmx2.hongying.com.
检查语法是否有错
[root@CentOS6 named]# named-checkzone "0.168.192.in-addr.arpa" 192.168.0.zone
zone 0.168.192.in-addr.arpa/IN: loaded serial 4033556584
OK
重新载入
[root@CentOS6 named]# service named reload
停止 named:                        [确定]
启动 named:                        [确定]


你可能感兴趣的:(linux,计算机,程序,课程,存储器)