Linux学习第九周


一、编写脚本,接受二个位置参数,magedu和/www,判断系统是否有magedu,如果没有则自动创建magedu用户,并自动设置家目录为/www;

[root@localhost ~]# mkdir /usr/sh
[root@localhost ~]# cd /usr/sh
[root@localhost sh]# vim user_create.sh
[root@localhost sh]# cat user_create.sh
#!/bin/bash

if [ "$1" == "magedu" -a "$2" == "/www" ];then
        if `grep "^$1\>" /etc/passwd` &> /dev/null;then
                echo "User $1 already exists."
        else
                useradd -d $2 $1
                echo $1 | passwd --stdin $1 &> /dev/null
                echo "User $1 created,The User password is $1."
        fi
else
        echo "Please input two args : "mageedu"  "/www""

        exit 2
fi
测试:
##添加执行权限
[root@localhost sh]# chmod +x user_create.sh
##参数数量不一致
[root@localhost sh]# sh user_create.sh www
Please input two args : mageedu  /www
##参数有误
[root@localhost sh]# sh user_create.sh magedu www
Please input two args : mageedu  /www
##输入为空
[root@localhost sh]# sh user_create.sh
Please input two args : mageedu  /www
##输入正确参数
[root@localhost sh]# ll /www
ls: 无法访问/www: 没有那个文件或目录
[root@localhost sh]# grep "magedu" /etc/passwd
[root@localhost sh]# grep "magedu" /etc/shadow
[root@localhost sh]# sh user_create.sh magedu /www
User magedu created,The User password is magedu.
[root@localhost sh]# ll /www
总用量 0
[root@localhost sh]# grep "magedu" /etc/passwd
magedu:x:1001:1001::/www:/bin/bash
[root@localhost sh]# grep "magedu" /etc/shadow
magedu:$6$rY9Bjlw9$9YzXbCO55txU3n7wwZTfiDgmdDgf1khIucdCX0nFP22HI5OSeIzvzVxcYHlT5bVYSWtmwofwpHUmysV2xdPDG1:18482:0:99999:7:::
##再次输入正确参数
[root@localhost sh]# sh user_create.sh magedu /www
useradd:用户“magedu”已存在
User magedu created,The User password is magedu.

二、使用expect实现自动登录系统;

[root@localhost sh]# yum install expect -y
[root@localhost sh]# cat auto_land.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect {
 "yes/no" { send "yes\n";exp_continue }
 "password" { send "$password\n" }
}
interact
测试:
[root@localhost sh]# chmod +x auto_land.exp
[root@localhost sh]# ip a | grep ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.112/24 brd 192.168.1.255 scope global noprefixroute ens33
[root@localhost sh]# ./auto_land.exp 192.168.1.111 root 1
spawn ssh [email protected]
[email protected]'s password:
Last login: Sat Aug  8 14:48:14 2020 from 192.168.1.112
[root@localhost ~]# ip a | grep ens33
2: ens33:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.111/24 brd 192.168.1.255 scope global noprefixroute ens33
[root@localhost ~]# exit
登出
Connection to 192.168.1.111 closed.


三、简述Linux操作系统启动流程 ;

1、CentOS6启动流程:
CentOS6启动流程

从图中可知,系统启动(不仅仅是Linux)大致可分为几个主要过程:硬件初始化、找到并加载操作系统的内核、内核初始化、操作系统运行环境初始化、登陆初始化、登陆成功后的用户初始化(包含图形界面初始化或shell的初始化),最终用户成功进入操作系统并开始使用操作系统。

大致过程:
1)按下电源键。主板通信后,CPU开始工作,它执行固定地址的一段非常小的硬编程程序:BIOS,于是BIOS掌握了CPU控制权;

2)BIOS程序会进行硬件的上电自检(Power-On Self-Test,POST)以确认有哪些硬件以及这些硬件是否没有故障。对于我们要探索的操作系统启动流程来说,最重要的是会根据检测到的磁盘顺序(除了磁盘,也可以的其它硬件设备,比如U盘、网卡等),按顺序找到这些磁盘上正确的MBR,于是MBR开始掌握CPU控制权;

3)MBR是引导系统内核启动的第一段代码,它的位置固定于磁盘的第一个扇区位置处(0柱面0磁头1扇区,如果不固定就不知道则么找到MBR)。引导内核启动的代码段称为Boot Loader,除了MBR外,还需要通过其它引导系统的代码段来一步一步引导内核启动,所以要引导一个内核启动,需要跳转并执行多段BootLoader,根据使用的启动管理工具(如LILO、GRUB、GRUB2等)不一样,这一段段的引导代码段称呼和存放位置都一样,但第一个引导内核启动的代码段称为MBR,也一定处于磁盘的第一个扇区位置,所以MBR才称为主引导记录(Master Boot Record)

4)当找到内核映像后,将内核映像装载到内核中并解压(如果被压缩的话),内核开始掌握CPU控制权并运行起来,期间内核会做很多工作,包括内核的初始化、挂载真正的根目录并从临时根目录切换到真正的根目录、启动一些重要的进程,例如idle、进程调度器、init进程等。然后开始执行用户空间的第一个进程:init 进程,于是init进程掌握了CPU的控制权,也从此进入用户空间;

5)init进程开始运行后就表示操作系统真正已经启动成功了,但它仍需做系统级别的初始化,比如设置主机名、设置硬件参数、加载硬件驱动、挂载/etc/fastab中的一些文件系统等等。系统级别的运行环境一切初始化完成后,于是提供用户登陆的界面,即init启动getty类的进程;

6)getty类的进程启动后,将打开一个终端,并提示用户输入用户名,然后启动一个login进程让用户输入密码并验证密码,密码验证通过后再审核用户名是否有权登陆,如果允许登陆,将根据/etc/passwd中的配置启动该用户对应的shell进程,例如bash进程;

7)shell进程启动后读取该shell进程对应的配置文件,并按照登陆式、交互式的shell运行模式进行初始化,初始化完成后将进入登陆式、交互式的shell,也就是命令行下;

8)至此,用户可以通过shell命令来使用操作系统。

CentOS7启动流程:

1、CentOS7的启动与CentOS6的启动,不同之处;
1)内核引导阶段,CentOS7默认使用grub2引导,而CentOS6默认使用传统的grub引导;
2)系统环境初始化和候面的过程。内核初始化完成后,启动PID-1的进程,CentOS7这个进程是systemd,而CentOS6是init。

2、Systemd几大特性;
1)系统初始化时实现服务并行启动;
2)按需启动守护进程;
3)自动化的服务依赖关系管理;
4)同时采用socket式与D-Bus总线式激活服务;
5)系统状态快照。

7)CentOS7启动流程,详细内容可参考 man bootup帮助手册;
1)UEFI或BIOS初始化,运行POST开机自检;

2)选择启动设备;

3)引导内核,做部分内核初始化工作,加载initramfs;

4)启动systemd进程,systemd进程此时工作再initramfs环境下;

5)systemd执行initrd.target所有单元,包括挂载/etc/fstab,从ramdisk的虚根文件系统切换到真正的根文件系统;

6)systemd执行默认target配置,其配置文件为/etc/systemd/system/default.target;

7)systemd执行sysinit.target初始化系统及basic.target准备操作系统;

8)systemd启动multi-user.target下的本机与服务器服务;

9)systemd执行multi-user.target下的/etc/rc.d/rc.local;

10)systemd执行multi-user.target下的getty.target让用户登陆;

11)启动shell进程并初始化,最终进入命令行。

上面的过程中需要关注的便是大大提前了systemd的工作,再内核初始化阶段就参与了剩下的工作。等到systemd完成了根文件系统的切换后,将正式进入操作系统的初始化过程,这是将进入步骤6)默认target配置文件default.target选择默认的“运行级别”。

查看default.target文件内容:

root@localhost ~]# cat /usr/lib/systemd/system/default.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target   ##注意此行
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
其中的“Requires=multi-user.target”即表示先执行multi-user.target文件,这是多用户模式的运行级别,继续查看该文件。
[root@localhost ~]# cat /usr/lib/systemd/system/multi-user.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target   ##注意此行
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
再次发现“Requires=basic.target”,这表示还需要先执行basic.target,再次查看。

[root@localhost ~]# cat /usr/lib/systemd/system/basic.target
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Basic System
Documentation=man:systemd.special(7)

Requires=sysinit.target   ##注意此行
After=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sockets.target paths.target slices.target
仍然要求“Requires=sysinit.target ”,该文件已经没有"Requires“了。

整理一下上面几个文件的执行顺序:sysinit.target——>basic.target
——>multi-user.target。
其次,从systemd退出内核初始化模式后,真正第一个执行的正是sysinit.target,它和Cent6的rc.sysinit一样,都是执行系统初始化。
从进入系统初始化开始,后续的操作和CentOS6并无多大差别,无非是systemd初始化的方式是并行的。
最终,启动getty类进程提示用户输入用户名,然后调用login验证用户,验证通过后最终初始化shell,并进入命令行模式。


四、破解centos7 密码。

1、rd.break重置root密码;

在Linux这样一个权限管理严格,系统安全性要求高的环境中,root的密码十分重要,但是万一把root用户密码忘记,这个时候就需要找回或者说重置root用户密码。
1)在grub提供菜单的界面下,在对应菜单项按下e进入编辑模式;

进入grub菜单

2)通过箭头方向键移动光标至linux16这一行,然后在该行末尾加上rd.break,之后按下ctrl+x引导系统;

rd.break

3)此时根被临时挂载在/sysroot目录下,且是只读挂载,所以先以读写方式重写挂载,然后chroot切换到根环境下修改密码,最后创建/.autorelabel;

密码重置过程

4)最后两次exit重启后即可使用新密码登录root用户。

两次exit
新密码登录
2、init重置root密码;

1)另一种方法重置口令,仍然重启修改grub菜单,在Linux16行最后加上rw init=/sysroot/bin/sh 后ctrl+x引导;

编辑grub菜单

2)引导进入后,直接chroot,然后修改密码,创建/.autorelabel(这句是为了selinux生效)后重启;

重置密码

3)重启后即可使用新密码登录root用户。

新密码登录

你可能感兴趣的:(Linux学习第九周)