本次做業內容: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