一、寫一個腳本,完成以下功能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.添加新硬盤
2.建立分區
fdisk /dev/sdb
partx -a /dev/sdb //手動識別新建立的分區
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分區
5.安裝grub
grub-install --root-directory=/mnt/dev/sdb
//指定root目錄爲boot目錄的父目錄,並指定要把grub裝到哪一個硬盤上
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須要的庫
ldd /bin/ls //查看ls須要的庫
ldd /bin/cat //查看cat須要的庫
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
10. 卸載該硬盤,並掛載到新的虛擬機上
八、寫一個腳本
(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