做業05

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

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

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

答:bash

#!/bin/bash
read -p "enter a disk path: " disk
        [ -z"$disk" ] && echo "need a disk path" &&exit 1
        if ! fdisk-l | grep "^Disk $disk" &> /dev/null; then
               echo "$disk is not exist"
        else
               fdisk -l $disk
        fi


 

 

 

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

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

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

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

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

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

答:

#!/bin/bash
mkdir -p /backups
case $1 in
gzip)
       tar -czvf /backups/etc-20160613.tar.gz /etc
       ;;
bzip2)
       tar -cjvf /backups/etc-20160613.tar.bz2 /etc
       ;;
xz)
       tar -cJvf /backups/etc-20160613.tar.xz /etc
       ;;
*)
       echo "wrong choose"
       exit 1
       ;;
esac


 

 

 

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

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

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

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

  (4) 其它爲沒法判斷;

答:

#!/bin/bash
if [ -L $1 ];then
        echo"It is a Path"
elif [ -d $1 ];then
        echo"It can be use cd"
elif [ -f $1 ];then
        echo"It can be read"
else
        echo"can not know what it is"
fi


 

 

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

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

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

答:

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


 

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

  (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系統的啓動流程(詳細到每一個過程系統作了哪些事情)

答:

 

1.     電腦加電自檢

 

2.     根據BIOS定義的啓動順序依次檢測相應啓動設備(包括光盤、硬盤、U盤、網卡)

 

3.     一旦掃描到設備上有系統引導(如MBR),將會加載該設備上的系統內核,中止檢測其餘啓動設備。即便該設備上系統內核沒法正常加載,也不會再繼續檢測其餘啓動設備

 

4.     初始化內核

     探測可識別到的全部硬件設備

     加載硬件驅動(會藉助initrd或initramfs)

     以只讀方式掛載根文件系統

     運行用戶空間的第一個程序/sbin/init

 

5.     執行/sbin/init,讀取/etc/inittab文件,進行系統初始化

設置系統默認啓動級別

運行系統初始化腳本,路徑爲/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)  清理操做

根據啓動級別(0-6),對目錄/etc/rc.d/rc#.d/內的全部腳本作啓動或中止操做

 

    最後執行/etc/rc.d/rc.local文件中自定義的命令

 

     設置登陸終端

 

 

 

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

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

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

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

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

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

答:

1.添加新硬盤

wKioL1jEFNvi2LmKAADMdra3A14754.jpg

2.建立分區

fdisk /dev/sdb

wKioL1jEFQyQQIA8AAGSdxoh4Pc496.jpg

partx -a /dev/sdb            //手動識別新建立的分區

wKiom1jEFUqwtbRoAACsbfPTLXo593.jpg

 

3.格式化

mke2fs -t ext4 /dev/sdb1

mke2fs -t ext4 /dev/sdb2

 

4.掛載boot分區

注:

boot分區必須掛載至boot目錄。因爲安裝grub時須要指定root目錄爲boot目錄的父目錄,所以boot目錄必須是某一個目錄的子目錄。實驗中,在/mnt/中建立boot目錄,並將boot分區掛載至/mnt/boot

mkdir /mnt/boot                     //建立boot目錄

 

mount /dev/sdb1 /mnt/boot          //掛載boot分區

wKiom1jEFWSR1M0NAAB261mHSxM929.jpg

 

5.安裝grub

grub-install --root-directory=/mnt/dev/sdb     

//指定root目錄爲boot目錄的父目錄,並指定要把grub裝到哪一個硬盤上

wKioL1jEFXrDW_ITAABLGlrYiEE902.jpg

 

6.拷貝內核及ramdisk文件

cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/     

//複製內核文件至boot分區

cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/

//複製ramdisk文件至boot分區

 

 

7.拷貝bash、ls、cat文件和其相關庫至root分區:

mkdir /mnt/root              //建立掛載目錄

mount /dev/sdb2 /mnt/root

 

ldd /bin/bash             //查看bash須要的庫

wKioL1jEFZjDL30GAADDhl1u01c726.jpg

ldd /bin/ls             //查看ls須要的庫

wKiom1jEFbbBm2POAADvBYTcw_o401.jpg

ldd /bin/cat             //查看cat須要的庫

wKiom1jEFc-CGoekAABrKVn_c-g195.jpg

 

mkdir /mnt/root/lib64       

mkdir /mnt/root/bin      //建立庫目錄,路徑要保持一致

 

cp /lib64/libtinfo.so.5 /mnt/root/lib64

cp /lib64/libdl.so.2 /mnt/root/lib64

cp /lib64/libc.so.6 /mnt/root/lib64

cp /lib64/ld-linux-x86-64.so.2 /mnt/root/lib64

cp /lib64/libselinux.so.1 /mnt/root/lib64/

cp /lib64/librt.so.1 /mnt/root/lib64/

cp /lib64/libcap.so.2 /mnt/root/lib64/

cp /lib64/libacl.so.1 /mnt/root/lib64/

cp /lib64/libpthread.so.0 /mnt/root/lib64/

cp /lib64/libattr.so.1 /mnt/root/lib64/

//複製庫文件

 

cp /bin/bash /mnt/root/bin

cp /bin/ls /mnt/root/bin

cp /bin/cat /mnt/root/bin

//複製二進制文件

 

8.建立其餘必須目錄

mkdir/mnt/root/{etc,sbin,lib,dev,proc,sys,tmp,var,usr,home,root}

 

9. 配置grub,設定系統引導參數

vim /mnt/boot/grub/grub.conf

wKioL1jEFeuyGA2bAABVrK0eWec881.jpg

 

10. 卸載該硬盤,並掛載到新的虛擬機上

wKioL1jEFgHgoGCLAABCPLQUq3Y449.jpg

wKiom1jEFhnBmVpmAACqQSzngVc674.jpg

 

 

八、寫一個腳本

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

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

  ...

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

答:

#!/bin/bash
service=$0
arg=$1
case $arg in
start)
        if [ -e /var/lock/subsys/$service];then
                echo "$service is up"
        else
                touch /var/lock/subsys/$service
                echo "starting $servicefinished"
        fi
        ;;
stop)
        if [ -e /var/lock/subsys/$service];then
                rm -rf/var/lock/subsys/$service
                echo "stoping $servicefinished"
        else
                echo "$service is notstart"
        fi
                ;;
restart)
        if [ -e /var/lock/subsys/$service];then
                rm -rf/var/lock/subsys/$service
                echo "stoping $servicefinished"
                touch /var/lock/subsys/$service
                echo "restaring $servicefinished"
        else
                echo "$service is notstart"
                touch /var/lock/subsys/$service
               echo "restaring$service finished"
        fi
                ;;
status)
        if [ -e /var/lock/subsys/$service];then
                echo "$service isrunning"
        else
                echo "$service isstoped"
        fi
                ;;
*)
        echo "wrong option"
        exit 1
        ;;
esac


 

 

 

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

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

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

答:

#!/bin/bash
while true; do
    ifwho | grep root &> /dev/null; then
           echo"root login"
           break
    fi
    sleep3
done


 

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

  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
while true; do
        case$option in
        cpu)
               lscpu
               break
                ;;
        mem)
                cat/proc/meminfo
               break
                ;;
        disk)
               fdisk -l
               break
                ;;
        quit)
               break
                ;;
        *)
               echo "wrong option,please enter again"
                ;;
        esac
        read -p"Enter a option: " option
done
        echo"======================"
        echo"bye"
        exit 0


 

 

 

 

十一、寫一個腳本

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

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

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

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

答:

#!/bin/bash
read -p "please input username or quit forquit:" username
echoUser()
{
        if id ${username}&> /dev/null; then
             grep"^${username}\>" /etc/passwd | awk -F:  '{print $3,$7}'
        else
            echo$username is not exist
        fi
 
}
while [ $username != "quit" ]; do
        echoUser
        read -p"please input username or quit for quit:" username
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
相關文章
相關標籤/搜索