Linux+Python高端運維班第五次做業

本次做業內容:linux

一、寫一個腳本,完成以下功能ios

    (1) 傳遞一個磁盤設備文件路徑給腳本,判斷此設備是否存在;vim

    (2) 若是存在,則顯示此設備上的全部分區信息;bash

答:ide

#!/bin/bash
#
if [ $# -ne 1 ]; then
echo "Please enter a disk device."
exit 2
fi
if [ -b $1 ]; then    
fdisk -l $1
else
echo "this disk device is not exist."
fi

二、寫一個腳本,完成以下功能函數

   傳遞一個參數給腳本,此參數爲gzip、bzip2或者xz三者之一;工具

   (1) 若是參數1的值爲gzip,則使用tar和gzip歸檔壓縮/etc目錄至/backups目錄中,並命名爲/backups/etc-20160613.tar.gz;ui

   (2) 若是參數1的值爲bzip2,則使用tar和bzip2歸檔壓縮/etc目錄至/backups目錄中,並命名爲/backups/etc-20160613.tar.bz2;this

   (3) 若是參數1的值爲xz,則使用tar和xz歸檔壓縮/etc目錄至/backups目錄中,並命名爲/backups/etc-20160613.tar.xz;url

   (4) 其它任意值,則顯示錯誤壓縮工具,並執行非正常退出;

答:

#!/bin/bash
#
[ -d /backups ] || mkdir /backups
read -p "pelase input a argu(gzip/bzip2/xz):" argu

case $argu in
gzip)
tar -Pzcf /backups/etc-`date +%Y%m%d`.tar.gz /etc 
;;
bzip2)
tar -Pjcf /backups/etc-`date +%Y%m%d`.tar.bz2 /etc
;;
xz)
tar -PJcf /backups/etc-`date +%Y%m%d`.tar.xz /etc
;;
*)
echo "error compression tools"
;;
esac

三、寫一個腳本,接受一個路徑參數:

   (1) 若是爲普通文件,則說明其可被正常訪問;

   (2) 若是是目錄文件,則說明可對其使用cd命令;

   (3) 若是爲符號連接文件,則說明是個訪問路徑;

   (4) 其它爲沒法判斷;

答:

if [ $# -lt 1 ];then
echo "please input a url"
fi
if [ -L $1 ];then
echo "this is a access url"
elif [ -d $1 ];then
echo "can use cd common"
elif [ -f $1 ];then
echo "normal access"
else
echo "unknow"
fi

四、寫一個腳本,取得當前主機的主機名,判斷

   (1) 若是主機名爲空或爲localhost,或爲"(none)",則將其命名爲mail.magedu.com;

   (2) 不然,顯示現有的主機名便可;

答:

#!/bin/bash
hostname=`hostname`
if [ $hostname == localhost -o $hostname == none ];then
hostname mail.magedu.com
else
echo $hostname
fi

五、寫一個腳本,完成以下任務 :

   (1) 按順序分別複製/var/log目錄下的每一個直接文件或子目錄至/tmp/test1-testn目錄中;

   (2) 複製目錄時,才使用cp -r命令;

   (3) 複製文件時使用cp命令;

   (4) 複製連接文件時使用cp -d命令;

   (5) 餘下的全部類型,使用cp -a命令;

答:

#!/bin/bash
mkdir /tmp/test1-testn
path="/tmp/test1-testn"
for file in /var/log/*;do
        if [ -d$file ]; then
                cp-r $file $path
        elif [ -L$file ];then
                cp-d $file $path
        elif [ -f$file ];then
                cp$file $path
        else
                cp-a $file $path
        fi
done

六、請詳細描述CentOS系統的啓動流程(詳細到每一個過程系統作了哪些事情)

答:

CentOS主機按如下順序啓動
(1)POST     加電自檢        
(2)BIOS     讀取CMOS中的BIOS設置的參數來識別基礎硬件,尋找到啓動設備        
(3)MBR          (1)讀取啓動設備MBR中前446字節的bootloader        
                (2)讀取MBR後的扇區用來識別grub以及內核kernel所在的區域        
                (3)啓動grub        
(4)GRUB     顯示菜單界面,選擇運行內核kernel;配置文件是/boot/grub/grub.conf        
                (1) 提供菜單、並提供交互式接口    
                (2) 加載用戶選擇的內核或操做系統    
                (3) 爲菜單提供了保護機制    
(5)KERNEL   自身初始化        
                (1)探測可識別到的全部硬件設備;    
                (2)加載硬件驅動程序;(有可能會藉助於ramdisk加載驅動)    
                (3)以只讀方式掛載根文件系統;    
                (4)運行用戶空間的第一個應用程序:/sbin/init    
(6)INIT     運行/sbin/init程序,配置文件/etc/inittab和/etc/init/*.conf        
            設置默認運行級別    如:id:3:initdefault:
            運行系統初始腳本    如:si::sysinit:/etc/rc.d/rc.sysinit
                (1) 設置主機名;    
                (2) 設置歡迎信息;    
                (3) 激活udev和selinux;     
                (4) 掛載/etc/fstab文件中定義的文件系統;    
                (5) 檢測根文件系統,並以讀寫方式從新掛載根文件系統;    
                (6) 設置系統時鐘;    
                (7) 激活swap設備;    
                (8) 根據/etc/sysctl.conf文件設置內核參數;    
                (9) 激活lvm及software raid設備;    
                (10) 加載額外設備的驅動程序;    
                (11) 清理操做;    
            關閉對應的腳本中須要關閉的服務,啓動須要啓動服務(實際服務命令位於/etc/rc.d/init.d)        
                l0:0:wait:/etc/rc.d/rc 0    
                l1:1:wait:/etc/rc.d/rc 1    
                ...    
                l6:6:wait:/etc/rc.d/rc 6    
            設置登陸終端         
                tty1:2345:respawn:/usr/sbin/mingetty tty1    
                tty2:2345:respawn:/usr/sbin/mingetty tty2    
                ...    
                tty6:2345:respawn:/usr/sbin/mingetty tty6

七、爲運行於虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;

  (1) 爲硬盤新建兩個主分區;併爲其安裝grub;

  (2) 爲硬盤的第一個主分區提供內核和ramdisk文件; 爲第二個分區提供rootfs;

  (3) 爲rootfs提供bash、ls、cat程序及所依賴的庫文件;

  (4) 爲grub提供配置文件;

  (5) 將新的硬盤設置爲第一啓動項並可以正常啓動目標主機;

答:

添加一塊硬盤
~]# fdisk /dev/sdb                                               //將新硬盤sdb分爲2個主區
~]# mke2fs -t ext4 /dev/sdb{1,2}                                //格式化分區
~]# mount /dev/sdb1 /mnt                                         //掛載分區1到/mnt目錄
~]# grub-install --root-directory=/mnt /dev/sdb                  //安裝grub到分區1上
~]# cp /boot/initramfs-2.6.32-504.el6.i686.img /mnt/initramfs    //複製內核文件
~]# cp /boot/vmlinuz-2.6.32-504.el6.i686 /mnt/vmlinuz            //複製ramdisk文件
~]# vim /mnt/boot/grub/grub.conf                                 //建立grub.conf文件
    default=0
    timeout=5
    title CentOS6(test)
    root (hd0,0)
    kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
    initrd /initramfs
~]# umount /dev/sdb1                                              //卸載分區1
~]# mount /dev/sdb2 /mnt                                          //掛載分區2
~]# mkdir -p /mnt/{bin,sbin,lib,lib64,etc,home,root,media,mnt,dev,tmp}
~]# mkdir -p /mnt/{usr/{bin,sbin,lib,lib64},var{lib,lib64,log,local,cache},proc,sys,selinux}
~]# cp /bin/{bash,ls,cat} /mnt/bin
~]# cp `ldd /bin/{bash,ls,cat}|grep -eo "/lib.*[[:space:]]"|
    sort -u` /mnt/lib                                             //複製lib文件
~]# sync                                                          //同步
~]# init 6                                                        //重啓主機
重啓後進入bios設置 調整硬盤啓動順序後保存退出。

八、寫一個腳本

  (1) 能接受四個參數:start, stop, restart, status

   start: 輸出「starting 腳本名 finished.」

   ...

  (2) 其它任意參數,均報錯退出;

答:

#!/bin/bash
#
if [ $# -eq 1 ];then
    case $1 in
    start)
        echo "starting $0 finished."
        ;;
    stop)
        echo "stopping $0 finished."
        ;;
    restart)
        echo "restart $0 finished."
        ;;
    status)
        echo "status $0 finished."
        ;;
    *)
        echo "error 2"
        exit 1
        ;;
    esac
else
    echo "error 1"
fi

九、寫一個腳本,判斷給定的用戶是否登陸了當前系統;

  (1) 若是登陸了,則顯示用戶登陸,腳本終止;

  (2) 每3秒鐘,查看一次用戶是否登陸;

答:

#!/bin/bash
#
if id $1 &>/dev/null && [ $# -eq 1 ] ;then    
    until  w |grep "^$1\>" &>/dev/null;do
        sleep 3
        echo "seaching..."    
    done
    echo "$1 is online."
else
    echo "UserId is error."
fi

十、寫一個腳本,顯示用戶選定要查看的信息;

   cpu) display cpu info

   mem) display memory info

   disk) display disk info

   quit) quit

   非此四項選擇,則提示錯誤,並要求用戶從新選擇,只到其給出正確的選擇爲止;

答:

#!/bin/bash
#
cat << EOF
cpu)    display cpu info
mem)    display memory info
disk)   display disk info
quit)   quit
==============================
EOF
read -p "Enter a option: " option
until [ "$option" == 'cpu' -o "$option" == "mem" -o "$option" == "disk" -o "$option" == "quit" ];do
    read -p "Wrong option, Enter again: " option
done

case "$option" in 
cpu)
    lscpu
    ;;
mem)
    cat /proc/meminfo
    ;;
disk)
    fdisk -l
    ;;
*)
    echo "Quit..."
    exit 0
    ;;
esac

十一、寫一個腳本

  (1) 用函數實現返回一個用戶的UID和SHELL;用戶名經過參數傳遞而來;

  (2) 提示用戶輸入一個用戶名或輸入「quit」退出;

    當輸入的是用戶名,則調用函數顯示用戶信息;

    當用戶輸入quit,則退出腳本;進一步地:顯示鍵入的用戶相關信息後,再次提醒輸出用戶名或quit: 

答:

#!/bin/bash
#
function userInfo {
uId=`grep "^$1\>" /etc/passwd | cut -d: -f3`
uShell=`grep "^$1\>" /etc/passwd | cut -d: -f7`
}
read -p "Input a user name or quit: " option
until [ "$option" == "quit" ];do
    if id $option &>/dev/null;then
        userInfo $option
        echo -e "User:\t$option\nUID:\t$uId\nSHELL:\t$uShell"
    else
        echo "Id is wrong."
    fi
    read -p "Input a user name or quit: " option
done

十二、寫一個腳本,完成以下功能(使用函數)

   (1) 提示用戶輸入一個可執行命令的名字;獲取此命令依賴的全部庫文件;

   (2) 複製命令文件至/mnt/sysroot目錄下的對應的rootfs的路徑上,例如,若是複製的文件原路徑是/usr/bin/useradd,則複製到/mnt/sysroot/usr/bin/目錄中;

   (3) 複製此命令依賴的各庫文件至/mnt/sysroot目錄下的對應的rootfs的路徑上;規則同上面命令相關的要求;

答:

#!/bin/bash
mkdir -p /mnt/sysroot
destPath="/mnt/sysroot"
read -p "enter a command: " command
which --skip-alias ${command} &> /dev/null
[ $? -ne 0 ] && echo "command notfound" && exit 1
binary=`which --skip-alias ${command}`
mkdir -p ${destPath}`dirname ${binary}`
cp --preserve ${binary} ${destPath}${binary}
for lib in `ldd ${binary} | awk ‘(NR>1){print$(NF-1)}‘`;do
        mkdir -p${destPath}`dirname ${lib}`
        cp--preserve ${lib} ${destPath}${lib}
done
相關文章
相關標籤/搜索