; 马哥教育网络班20期+第10周课程练习 | Linux运维部落

马哥教育网络班20期+第10周课程练习

 1. 请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)

1. 加电自检:POST
    通电后主板CMOS中的BIOS(基本输入输出系统)将进行硬件自检并简单设置,根据硬盘等
    相关设备情况进入下一步
    BIOS:Basic Input and Output System基本输入输出系统
2. 引导加载次序:BOOT Sequence
    按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备
3. 引导加载器:bootloader
    用来引导系统加载的程序
    ·windows: ntloader
    ·Linux:
        LILO:LInux Loader(早期)
        GRUB: GRand Uniform Bootloader(统一引导加载器)
            GRUB 0.X: GRUB Legacy(GRUB传统版)
            GRUB 1.x: GRUB2(CentOS 7)
功能:
    提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存
    中的特定空间中,解压、展开,并把系统控制权移交给内核。
MBR:
  446:bootloader
  64:fat
  2:55AA
GRUB:
4. GRUB引导加载器
    GRUB 是bootloader阶段的引导程序,CentOS主要通过GRUB(GRand Unified 
    Bootloader)引导。
(1)GRUB引导步骤:grub legacy       
stage1: mbr(磁盘分区表)         
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;         
stage2:磁盘分区(/boot/grub/)
    配置文件:/boot/grub/grub.conf  /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区;
(2)GRUB的功用
1.提供菜单、并提供交互式接口  
  e: 编辑模式,用于编辑菜单;  
  c: 命令模式,交互式接口;  
2.加载用户选择的内核或操作系统  
  允许传递参数给内核  
  可隐藏此菜单  
3.为菜单提供了保护机制  
  为编辑菜单进行认证  
  为启用内核或操作系统进行认证
(3)GRUB常用命令
·#help: 获取帮助列表
·#help KEYWORD: 详细帮助信息
·#find (hd#,#)/PATH/TO/SOMEFILE:查找磁盘#上的#分区的某文件
·#root (hd#,#)把第#磁盘的第#号分区设定为grub的根设备
·#kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核
支持使用的cmdline参数;例如:init=/path/to/init, selinux=0 表示禁用内核
·#initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
·#boot: 引导启动选定的内核;

手动在grub命令行接口启动系统:
    # grub > root (hd#,#)  ( hd#:磁盘编号   #:分区编号 )
    # grub > kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
    # grub > initrd /initramfs-VERSION-RELEASE.img
    # grub > boot
(4)配置文件(grub保护机制)
[root@localhost ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/sda1
#          initrd /boot/initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title centos (2.6.32-71.el6.i686)
     root (hd0,0)
     kernel /boot/vmlinuz-2.6.32-71.el6.i686 ro 
     root=UUID=e6d7fd68-b2ef-424a-b4f4-f1145d953389 rd_NO_LUKS rd_NO_LVM
            rd_NO_MD rd_NO_DM.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us
            crashkernel=auto rhgb quiet
     initrd /boot/initramfs-2.6.32-71.el6.i686.img
常用配置项
    default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
    timeout=#:指定菜单项等待选项选择的时长;
    splashimage=(hd#,#) /PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
    hiddenmenu:隐藏菜单;
    password [--md5] STRING: 菜单编辑认证;
    title TITLE:定义菜单项“标题”, 可出现多次;
    root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
    initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
    password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
5. 进入Kernel
    在GRUB中选择对应的kernel后,kernel会对自身进行初始化
    自身初始化:
1.探测可识别到的所有硬件设备;
2.加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
    ramdisk:内核中的特性之一:使用缓冲和缓存来实现对磁盘上的文件访问
      CentOS 5:initrd, 工具程序:mkinitrd
      CentOS 6:initramfs, 工具程序:mkinitrd,dracut
3.以只读方式挂载根文件系统;
4.运行用户空间的第一个应用程序:/sbin/init
init程序的类型
SysV: init, CentOS 5
   配置文件:/etc/inittab
Upstart: init, CentOS 6
   配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7
   配置文件:/usr/lib/systemd/system, /etc/systemd/system
系统初始化小结:
    POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> 
    rootfs(只读) --> init
6. 运行init
    CentOS 6的init位置为/sbin/init,共分7个级别
6.1运行级别:为了系统的运行或维护等应用目的而设定
  0:关机
  1:单用户模式(root, 无须登录), single, 维护模式;
  2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
  3:多用户模式,正常模式;文本界面;
  4:预留级别;可同3级别;
  5:多用户模式,正常模式;图形界面;
  6:重启
默认级别:3,5
切换级别:init ?
如:# init 0 表示关机
查看级别:
    # runlevel
    # who -r
[root@localhost ~]# runlevel
N 5
[root@localhost ~]# who -r
运行级别 5 2016-08-10 11:09
6.2 配置文件:/etc/inittab,
CenOS 6的upstart程序配置文件还包括/etc/init/*.conf
    配置文件格式为:id:runlevel:action:process
每行定义一种action以及与之对应的process(进程)
id:指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,
要求id与tty的编号相同,否则getty程序将不能正常工作。
runlevel:init的系统运行级别
action:是用来定义后面process的运行方式,常用的有下面几种
wait: 切换至此级别运行一次;
respawn:此process终止,就重新启动之;
initdefault:设定默认运行级别;process省略;
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
process:为具体的执行程序
查看本机配置文件显示为
    id:5:initdefault:表示默认运行级别5,即多用户模式的图形界面
[root@localhost ~]# cat /etc/inittab | tail -10
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:
如果设定系统初始化方式为:10:0:wait:/etc/rc.d/rc 0 表示读取/etc/rc.d/rc3.d/下的配置文件
rc 0 相当于读取/etc/rc.d/rc0.d/  
打开此目录下的文件名为:K或S+2个数字+文件名
[root@localhost ~]# ls /etc/rc.d/rc0.d
K01certmonger    K72autofs         K87irqbalance
K01smartd      K73ypbind         K87restorecond
K02avahi-daemon    K74acpid          K87rpcbind
K02oddjobd     K74haldaemon       K88auditd
K05atd       K74nscd           K88nslcd
K10cups       K74ntpd           K88rsyslog
K10psacct      K75netfs          K89portreserve
K10saslauthd     K75ntpdate         K89rdisc
K15httpd      K75udev-post       K90network
K16abrtd      K80kdump          K92ip6tables
K25sshd       K80sssd          K92iptables
K30postfix     K83bluetooth       K95cgconfig
K43vmware-tools-thinprint  K83nfslock   K95firstboot
K50dnsmasq     K83rpcgssd         K99cpuspeed
K50netconsole    K83rpcidmapd        K99lvm2-monitor
K50snmpd      K84NetworkManager      K99microcode_ctl
K50snmptrapd    K84wpa_supplicant      K99sysstat
K60crond      K85mdmonitor         K99vmware-tools
K60nfs       K85messagebus         S00killall
K69rpcsvcgssd   K86cgred            S01halt
说明:
K开头的文件,K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;
S开头的文件,S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务;
7.系统初始化脚本:/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.清理操作;
8.启动系统服务
centos6下的系统服务脚本都放在/etc/rc.d/init.d或者/etc/init.d中,因为建立了链接,
所以内容是一样的
[root@localhost ~]# ll /etc/init.d
lrwxrwxrwx. 1 root root 11 7月   4 17:17 /etc/init.d -> rc.d/init.d
[root@localhost ~]# ls !$
ls /etc/init.d
abrtd         haldaemon       nfs          rsyslog
acpid         halt            nfslock      sandbox
atd           httpd           nscd         saslauthd
auditd        ip6tables       nslcd        single
autofs        iptables        ntpd         smartd
avahi-daemon  irqbalance      ntpdate      snmpd
bluetooth     kdump           oddjobd      snmptrapd
certmonger    killall         portreserve  sshd
cgconfig      lvm2-monitor    postfix      sssd
cgred         mdmonitor       psacct       sysstat
cpuspeed      messagebus      rdisc        udev-post
crond         microcode_ctl   restorecond  vmware-tools
cups          netconsole      rpcbind      vmware-tools-thinprint
dnsmasq       netfs           rpcgssd      wpa_supplicant
firstboot     network         rpcidmapd    ypbind
functions     NetworkManager  rpcsvcgssd
chkconfig命令:
(1)查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
[root@localhost ~]# chkconfig --list
NetworkManager 0:关闭      1:关闭      2:启用      3:启用      4:启用      5:启用      6:关闭
abrtd              0:关闭      1:关闭      2:关闭      3:启用      4:关闭      5:启用      6:关闭
acpid              0:关闭      1:关闭      2:启用      3:启用      4:启用      5:启用      6:关闭
... ...
(2)添加:
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
# chkconfig --add name
(3)删除:
# chkconfig --del name
(4)修改指定的链接类型
# chkconfig [--level levels] name <on|off|reset>
  --level LLLL: 指定要设置的级别;省略时表示2345;
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,
而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/
目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;
                                                        mingetty会调用login程序9. 设置登陆终端
根据终端配置打印登陆提示符
初始化阶段小结为:
/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、
完成系统初始化 --> 关闭对应下需要关闭的服务,启动需要启动服务 --> 设置登录终端
总结
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) -->
rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) -->
设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端

2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;

(1) 为硬盘新建两个主分区;并为其安装grub;

(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;

(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;

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

(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;

(1)为硬盘新建两个主分区;/dev/sdb1; /dev/sdb2
[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x14cc3f0b.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (655-2610, default 655):
Using default value 655
Last cylinder, +cylinders or +size{K,M,G} (655-2610, default 2610): +5G
 
Command (m for help): p
 
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x14cc3f0b
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         654     5253223+  83  Linux
/dev/sdb2             655        1308     5253255   83  Linux
 
Command (m for help): w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partx -a /dev/sdb  # 通知内核重新读取硬盘分区
BLKPG: Device or resource busy
error adding partition 1
BLKPG: Device or resource busy
error adding partition 2
[root@localhost ~]# mkfs -t ext4 /dev/sdb1 # 设置文件格式为ext4
[root@localhost ~]# mkfs -t ext4 /dev/sdb2
(2)为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供rootfs;
[root@localhost ~]# mkdir /mnt/boot /mnt/sysroot
[root@localhost ~]# mount /dev/sdb1 /mnt/boot/
[root@localhost ~]# mount /dev/sdb2 /mnt/sysroot/
[root@localhost ~]# ls /mnt/boot
lost+found
[root@localhost ~]# ls /mnt/sysroot
lost+found
[root@localhost ~]# cp /boot/vmlinuz-2.6.32-71.el6.i686 /mnt/boot/vmlinuz
[root@localhost ~]# cp /boot/initramfs-2.6.32-71.el6.i686.img /mnt/boot/initramfs.img
[root@localhost ~]# ls /mnt/boot
initramfs.img  lost+found  vmlinuz
# 为其安装grub
[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
 
(fd0)   /dev/fd0
(hd0)   /dev/sda
(hd1)   /dev/sdb
[root@localhost sysroot]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
[root@localhost sysroot]# ls
bin  etc   lib    lost+found  mnt   root  sys  usr
dev  home  lib64  media       proc  sbin  tmp  var
(3)为rootfs提供bash、ls、cat程序及所依赖的库文件;
[root@localhost ~]# mkdir /mnt/sysroot/{bin,lib64}/
[root@localhost sysroot]# cp /bin/bash /bin/ls /bin/cat /mnt/sysroot/bin/
[root@localhost sysroot]# cp `ldd /bin/bash | sed '1d'| grep -Eo "/.*[0-9] "` /mnt/sysroot/lib64/
[root@localhost sysroot]# cp `ldd /bin/ls | sed '1d'| grep -Eo "/.*[0-9] "` /mnt/sysroot/lib64/
[root@localhost sysroot]# cp `ldd /bin/cat | sed '1d'| grep -Eo "/.*[0-9] "` /mnt/sysroot/lib64/
(4)为grub提供配置文件;
[root@localhost sysroot]# vim /mnt/boot/grub/grub.conf
[root@localhost sysroot]# cat /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS (Express)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs.img
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
关闭用来设置的虚拟机,新建虚拟机,将原来添加的虚拟磁盘加载到新虚拟机,可正常启动bash,并能执行ls和cat命令
bash-4.1 # ls /bin/
bash cat ls

3、制作一个kickstart文件以及一个引导镜像。描述其过程。

一、kickstart文件的格式:
(1)命令段:指明各种安装前配置,如键盘类型等;
(2)程序包段:指明要安装的程序包组或程序包,不安装的程序包等;
    %packages(开始)
    @group_name(包组)
    package(要安装的程序包)
    -package(不安装的程序包)
    %end(结束)
(3)脚本段:
    %pre: 安装前脚本
        运行环境:运行于安装介质上的微型Linux环境
    %post: 安装后脚本
        运行环境:安装完成的系统;
(4)命令段中的命令:
# 必备命令
authconfig: 认证方式配置
    authconfig --useshadow  --passalgo=sha512(密码加密格式)
bootloader:bootloader的安装位置及相关配置
    bootloader --location=mbr --driveorder=sda 
    --append="crashkernel=auto crashkernel=auto rhgb rhgb quiet quiet"
keyboard: 设定键盘类型
lang: 语言类型
part: 创建分区
rootpw: 指明root的密码
timezone: 时区
# 可选命令
install OR upgrade(安装或升级)
text: 文本安装界面
network
firewall
selinux
halt(关机)
poweroff(关机)
reboot(重启)
repo(安装过程中额外用到的)
user:安装完成后为系统创建新用户
url: 指明安装源
二、创建kickstart文件的方式:
(1)直接手动编辑;
  依据某模板修改;
(2)可使用创建工具:system-config-kickstart (CentOS 6)
  依据某模板修改并生成新配置;
三、检查ks文件的语法错误:ksvalidator
  # ksvalidator /PATH/TO/KICKSTART_FILE
四、创建引导光盘:
  # mkisofs -R -J -T -v &ndash;no-emul-boot &ndash;boot-load-size 4 &ndash;
  boot-info-table -V &ldquo;CentOS 6.8 x86_64 boot&rdquo;-b isolinux/isolinux.bin 
   -c isolinux/boot.cat -o /root/boot.iso myiso/

1、anaconda的配置方式:
    (1) 交互式配置方式;
    (2) 通过读取事先给定的配置文件自动完成配置;
    a)按特定语法给出的配置选项;
       kickstart文件;
      b)安装引导选项:
        text: 文本安装方式
        method: 手动指定使用的安装方法
      c)与网络相关的引导选项:
        ip=IPADDR
        netmask=MASK
        gateway=GW
        dns=DNS_SERVER_IP
        ifname=NAME:MAC_ADDR
      d)与远程访问功能相关的引导选项:
        vnc
        vncpassword='PASSWORD'
      e)指明kickstart文件的位置
        ks=
        DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
        Hard drive: ks=hd:/device/drectory/KICKSTART_FILE
        HTTP server: ks=http://host:port/path/to/KICKSTART_FILE
        FTP server: ks=ftp://host:port/path/to/KICKSTART_FILE
        HTTPS server: ks=https://host:port/path/to/KICKSTART_FILE
      f)启动紧急救援模式:
        rescue
2、 kickstart文件的格式:
      a)命令段:指明各种安装前配置,如键盘类型等;
      b)程序包段:指明要安装的程序包组或程序包,不安装的程序包等;
            %packages
            @group_name
            package
            -package
            %end
      c)脚本段:
            %pre: 安装前脚本
    d)运行环境:运行于安装介质上的微型Linux环境
           %post: 安装后脚本
       运行环境:安装完成的系统;
    
   命令段中的命令:
       必备命令
            authconfig: 认证方式配置
            authconfig --useshadow  --passalgo=sha512
            bootloader:bootloader的安装位置及相关配置
            bootloader --location=mbr --driveorder=sda 
                        --append="crashkernel=auto 
                        crashkernel=auto rhgb rhgb quiet quiet"
            keyboard: 设定键盘类型
            lang: 语言类型
            part: 创建分区
            rootpw: 指明root的密码
            timezone: 时区
        可选命令
            install OR upgrade
            text: 文本安装界面
            network
            firewall
            selinux
            halt
            poweroff
            reboot
            repo
            user:安装完成后为系统创建新用户
            url: 指明安装源
3、创建kickstart文件的方式:
   (1) 直接手动编辑;
       依据某模板修改;
   (2) 可使用创建工具:system-config-kickstart (CentOS 6)
       依据某模板修改并生成新配置;
4、检查ks文件的语法错误:ksvalidator
   # ksvalidator /PATH/TO/KICKSTART_FILE
5、创建引导光盘:
   # mkisofs -R -J -T -v &ndash;no-emul-boot &ndash;boot-load-size 4 &ndash;
   boot-info-table -V &ldquo;CentOS 6.8 x86_64 boot&rdquo; 
   -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/
[root@localhost ~]# yum install system-config-kickstart
[root@localhost ~]# system-config-kickstart # 进入图形界面

4、写一个脚本

(1) 能接受四个参数:start, stop, restart, statusstart: 输出“starting 脚本名 finished.”

(2) 其它任意参数,均报错退出;

#!/bin/bash
# chkconfig: - 88 12
# description:test service script
prog=$(basename $0)
lockfile=/var/lock/subsys/$prog
start(){
    if [ -e $lockfile ];then
    echo "$prog is aleady running."
    return 0
    else
    touch $lockfile
    [ $? -eq 0 ] && echo "starting $prog finished."
    fi
}
stop(){
    if [ -e $lockfile ];then
    rm -f $lockfile && echo "stop $prog ok."
    else
    echo "$prog is stopped yet."
    fi
}
status(){
    if [ -e $lockfile ];then
    echo "$prog is running."
    else
    echo "$prog is stopped."
    fi
}
usage(){
    echo "Usage:$prog {start|stop|restart|status}"
}
if [ $# -lt 1 ] || [ $1 != "start" -a $1 != "stop" -a $1 != "restart" -a $1 != "status"  ];then
    usage
    exit 1
fi
case $1 in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    stop
    start
    ;;
status)
    status
    ;;
*)
    usage
esac

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

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

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

方法一:(while循环)
#/bin/bash
read -p "Enter a user name:" username
while true;do
    if who | grep "^$username" &> /dev/null;then
        break
    fi
    sleep 3
done
echo "$username logged on!"
方法二:(until循环)
#/bin/bash
read -p "Enter a user name:" username
until who | grep "^$username" &> /dev/null;do
    sleep 3
done
echo "$username logged on!"

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

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 [ "$option" ! = "cpu" -a "$option" ! = "mem" -a "$option" ! = "disk" -a "$option" ! = "disk" -a "$option" ! = "quit" ];do
    read -p "Wrong option,please enter again:" option
done
case "$option" in
cpu)
    lscpu
    ;;
mem)
    cat /proc/meminfo
    ;;
disk)
    fdisk -l
    ;;
*)
    echo "Quit..."
    exit 0
    ;;
esac

7、写一个脚本

(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;

(2) 提示用户输入一个用户名或输入“quit”退出;当输入的是用户名,则调用函数显示用户信息;当用户输入quit,则退出脚本;

进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:

#!/bin/bash
#
function showinfo {
if id $name &> /dev/null;then
    echo "UID : `id -u $name`"
    echo "SHELL:`grep -E '^('$name')\>' /etc/passwd | cut -d: -f7`"
    read -p "Enter a username or quit:" name
else
    read -p  "wrong argument,plsease enter a username or quit:" name
fi
}
read -p "Enter a username or quit:" name
while [ "$name" != "quit" ];do
    showinfo $name
done

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

(1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;

(2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;

(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;(ldd /bin/ls | grep -o "/[^[:space:]]\{1,\}"可筛选出命令对应的库文件) 

#!/bin/bash
read -p "Enter a exeable commond:" cmd
path() {
     whereis $cmd | cut -d' ' -f2
}
mkdir /mnt/sysroot/{bin,lib}
comfilecp(){
    cp $(path $1) /mnt/sysroot$(path $1)
    echo "cp command file $(path $1) to /mnt/sysroot sucess."
}
libfilecp(){
    libdir=`ldd $(path $1)| sed '1d'| grep -Eo "/.*[0-9] "`
    for i in $libdir;do
        cp $i /mnt/sysroot$i
        echo "cp lib file $line to /mnt/sysroot sucess."
    done
}
comfilecp
libfilecp

原创文章,作者:二极管,如若转载,请注明出处:/34335

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-17 14:22

    写的很好,排版也很棒,加油

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:guoqibee.com  万达娱乐开户  万达直属QQ  万达主管  万达娱乐主管QQ  万达娱乐主管QQ  万达娱乐开户  万达娱乐直属  万达娱乐  万达娱乐开户