1、写一个脚本,完成如下功能

   (1) 传递一个磁盘设备文件路径给脚本,判断此设备是否存在;

(2) 如果存在,则显示此设备上的所有分区信息;

答:

#!/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


 

 

 

2、写一个脚本,完成如下功能

   传递一个参数给脚本,此参数为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;

  (3) 如果参数1的值为xz,则使用tar和xz归档压缩/etc目录至/backups目录中,并命名为/backups/etc-20160613.tar.xz;

  (4) 其它任意值,则显示错误压缩工具,并执行非正常退出;

答:

#!/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


 

 

 

3、写一个脚本,接受一个路径参数:

  (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


 

 

4、写一个脚本,取得当前主机的主机名,判断

  (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


 

5、写一个脚本,完成如下任务 :

  (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


 

 

6、请详细描述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文件中自定义的命令

 

     设置登录终端

 

 

 

7、为运行于虚拟机上的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

 

 

8、写一个脚本

  (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


 

 

 

9、写一个脚本,判断给定的用户是否登录了当前系统;

  (1)如果登录了,则显示用户登录,脚本终止;

(2) 每3秒钟,查看一次用户是否登录;

答:

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


 

10、写一个脚本,显示用户选定要查看的信息;

  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


 

 

 

 

11、写一个脚本

  (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


 

 

 

12、写一个脚本,完成如下功能(使用函数)

  (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