接上个章节:
位置变量Shell脚本应用示例:
编写脚本,接受二个位置参数,magedu和/www,判断系统是否有magedu,如果没有则自动创建magedu用户,并自动设置家目录为/www
cat location_useradd.sh
#!/bin/bash
result=`id $1 &>/dev/null;echo $?`
if [ -z "$1" ];then
echo "Please input your username."
exit 0
elif [ -z "$2" ];then
echo "Please input home directory."
exit 0
elif [ $result -eq 0 ];then
echo "该用户已存在"
else
useradd $1 -m -d $2 && id $1
fi
验证结果:
[root@localhost ~]# ./location_useradd.sh
Please input your username.
[root@localhost ~]# ./location_useradd.sh magedu
Please input home directory.
[root@localhost ~]# ./location_useradd.sh magedu /www
uid=2029(magedu) gid=2031(magedu) groups=2031(magedu)
[root@localhost ~]# ./location_useradd.sh magedu /www
该用户已存在
一、expect介绍
expect 是由Don Libes基于Tcl( Tool Command Language )语言开发的一款工具,主要应用于自动化交互式操作的场景,借助 expect 处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,能够大大提高系统管理人员的工作效率。
语法:expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
选项:
- -c:从命令行执行expect脚本,默认expect是交互地执行的
- -d:可以输出输出调试信息
相关指令
- spawn 启动新的进程
- send 用于向进程发送字符串
- expect 从进程接收字符串
- interact 允许用户交互
- exp_continue 匹配多个字符串在执行动作后加此命令
expect最常用的语法(tcl语言:模式-动作)
单一分支模式语法:
expect “hi” {send “You said hi\n"}
匹配到hi后,会输出“you said hi”,并换行多分支模式语法:
expect "hi" { send "You said hi\n" }
"hehe" { send "Hehe yourself\n" }
"bye" { send "Good bye\n" }匹配hi,hello,bye任意字符串时,执行相应输出。等同如下:
expect {
"hi" { send "You said hi\n"}
"hehe" { send "Hehe yourself\n"}
"bye" { send " Good bye\n"}
}
示例:使用expect实现自动登录系统
cat ssh.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\n";exp_contine }
"password" { send "$password\n" }
}
interact
验证结果:
./ssh5.exp <ipaddress> root <password>
spawn ssh root@172.16.77.131
root@172.16.77.131's password:
Last login: Sat May 30 22:49:22 2020 from 172.16.77.131
二、系统启动流程
2.1 Linux系统组成
Linux: kernel+rootfs
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)
程序:二进制执行文件
2.2 系统引导流程
CentOS 6:
- 固件firmware(CMOS/BIOS) POST加电自检
- 自举程序BootLoader(GRUB) 加载内核
- 载入内核kernel 驱动硬件
- 启动进程init)
读取执行配置文件/etc/inittab 依次执行其中的有效语句设定initdefault默认的运行级别
启动/etc/rc.d/rc.sysinit 系统服务初始化加载脚本
通过rc这个脚本判断initdefault系统缺省的运行级别
执行相对应目录下的启动脚本/etc/rc.d/rcN.d (N=0-6) 脚本开头S表示启动,K表示关闭。 - 执行/bin/login程序,等待用户登录
CentOS 7:
- UEFi或BIOS初始化,运行POST开机自检
- 选择启动设备
- 引导装载程序:grub2
- 加载装载程序的配置文件:
/etc/grub.d/
/etc/default/grub
/boot/grub2/grub.cfg - 加载initramfs驱动模块
- 加载内核选项
- 内核初始化,使用systemd
- 执行initrd.target所有单元,包括挂载/etc/fstab
- 从initramfs根文件系统切换到磁盘根目录
- systemd执行默认target配置,配置文件/etc/systemd/system/default.target
- systemd执行sysinit.target初始化系统及basic.target准备操作系统
- systemd启动multi-user.target下的本机与服务器服务
- systemd执行multi-user.target下的/etc/rc.d/rc.local
- systemd执行multi-user.target下的getty.target及登录服务
- systemd执行graphical需要的服务
三、破解centos7 系统登陆口令
- 重新引导机器(略)
- 进入单用户模式
在看到内核引导列表时,按e进行编辑,在以linux16开头的行尾加入init=/bin/sh,去掉rhgb和 quiet参数可以查看详细的启动过程(可选),按ctrl+x启动系统,此时无需密码即可进入系统 - 重置密码
进入单用户模式,以rw的方式重新挂载/(否则没有权限写入):
mount -o remount,rw /
强制修改用户的密码
echo 'password' | passwd --stdin root
为了保证一些文件受到selinux上下文的影响,所以必须执行下面的命令:
touch /.autorelabel
启动初始化进入系统:
exec /sbin/init
- 验证
在登陆提示符或窗口处输入重置后的密码,查看是否能够正常登陆