@mrz1
2017-12-24T09:19:12.000000Z
字数 9187
阅读 881
笔记
while CONDITION; do
循环体
done
如果最后一个计算值为0,则返回1;否则返回0
[root@centos7 ~]#i=0
[root@centos7 ~]#let i++
[root@centos7 ~]#echo $?
1
[root@centos7 ~]#i=0
[root@centos7 ~]#let ++i
[root@centos7 ~]#echo $?
0
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件:CONDITION为true
退出条件:CONDITION为false
1、编写脚本,求100以内所有正奇数之和
2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少
read -p "Please input the network(eg:192.168.1.0): " network
[[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "please input a legal IP" ; exit 1; }
net=`echo $network |cut -d. -f1-3`
i=1
up=0
down=0
while [ "$i" -le 254 ];do
ping -c1 -W1 $net.$i &> /dev/null && { echo $net.$i is up ; let ++up; } || { echo $net.$i is down ; let down++; }
let i++
done
wait
echo ip Up host is $up
echo ip Down host is $down
3、编写脚本,打印九九乘法表
4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值
i=1
while [ "$i" -le 10 ];do
num=`echo $RANDOM`
echo $num
if [ "$i" = 1 ];then
max=$num
min=$num
else
if [ "$num" -gt "$max" ];then
max=$num
elif [ "$num" -lt "$min" ];then
min=$num
fi
fi
let i++
done
echo "the max is $max"
echo "the min is $min"
5、编写脚本,实现打印国际象棋棋盘
6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令:echo $RANDOM|md5sum|cut -c1-10
后的结果,请破解这些字符串对应的RANDOM值
i=0
while [ $i -le 32767 ];do
rand=`echo $i | md5sum|cut -c1-10`
case $rand in
efbaf275cd)
echo $i md5 is efbaf275cd
;;
4be9c40b8b)
echo $i md5 is 4be9c40b8b
;;
44b2395c46)
echo $i md5 is 44b2395c46
;;
f8c8873ce0)
echo $i md5 is f8c8873ce0
;;
b902c16c8b)
echo $i md5 is b902c16c8b
;;
ad865d2f63)
echo $i md5 is ad865d2f63
;;
esac
let i++
done
7、自动启动httpd服务
sleeptime=30
while true;do
if killall -0 httpd >& /dev/null;then
true
else
systemctl restart httpd
time=`date +%F %T`
echo "AT $time httpd is restarted " >> /app/httpd.log
fi
sleep $sleeptime
done
nohup 脚本 //断网也会执行此脚本
8、删除ss -nt 中最大连接数的ip地址,加入防火墙
sleeptime=60
max_num=3
while sleep $sleeptime ;do
ss -nt| grep ESTAB |tr -s " " :|cut -d: -f6|uniq -c |while read num ip
;do
if [ ! $num -le $max_num ];then
iptables -A INPUT -s "$ip" -j REJECT
fi
done
done
lastb //查看失败连接的信息
9、lastb 中最近100条记录中拒绝失败次数超过5次的IP连接(如果此IP已经被拒绝,就不要再重复拒绝)(未完成:把加入防火墙中的ip 不再加入没意义)
sleeptime=10
max_num=3
while sleep $sleeptime ;do
cat /app/wang/lastb.log |grep ssh:notty |tr -s " " :|cut -d: -f4|uniq -c|sort -nr|while read num ip ;do
if [ ! $num -le $max_num ];then
iptables -A INPUT -s "$ip" -j REJECT
fi
done
done
until CONDITION;do
循环体
done
进入条件:CONDITION 为false
退出条件:CONDITION 为true
用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
while CONDTIITON1; do
CMD1...
if CONDITION2; then
continue
fi
CMDn
...
done
用于循环体中
break [N]:提前结束第N层循环,最内层为第1层
while CONDTIITON1; do
CMD1...
if CONDITION2; then
break
fi
CMDn
...
done
shift [n]
用于将参量列表list 左移指定次数,缺省为左移一次。
参量列表list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到shift
./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h
#!/bin/bash
while [ $# -gt 0 ] # or (( $# > 0 ));do
echo $*
shift
done
while true; do
循环体
done
until false; do
循环体
Done
1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/app/cracker.log中,并退出脚本
until false ;do
sleep 1
pkill -u hacker -9 && echo "at `date +'%F %T'` cracker is killed" >> /app/cracker.log
done
2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出
ram=`echo $[$RANDOM%10]`
read -p "猜数字游戏(0-9): " num
until [[ $num -eq $ram ]];do
if [ $num -lt $ram ];then
read -p "数字有点小: " num
else
read -p " 数字有点大: " num
fi
done
ram=`echo $[$RANDOM%10]`
read -p "猜数字游戏(0-9):" num
weile [[ $num -ne $ram ]];do
if [ $num -lt $ram ];then
read -p "数字有点小: " num
else
read -p " 数字有点大: " num
fi
done
3、用文件名做为参数,统计所有参数文件的总行数
4、用二个以上的数字为参数,显示其中的最大值和最小值
while循环的特殊用法(遍历文件的每一行):
while read line;do
循环体
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line
扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。
while read line ;do
comment=`echo $line | cut -d: -f5`
username=`echo $line | cut -d: -f1`
[ -z "$comment" ] && chfn -f "$username" -p 62985600 $username&> /dev/null && echo "$username is modified"
done < /etc/passwd
双小括号方法,即((...))格式,也可以用于算术运算
双小括号方法也可以使bash Shell实现C语言风格的变量操作I=10((I++))
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
Linux: kernel+rootfs
kernel: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:程序和glibc
库:函数集合, function, 调用接口(头文件负责描述)
过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件
内核设计流派:
单内核(monolithic kernel):Linux
把所有功能集成于同一个程序
ll /boot/vmlinuz-3.10.0-693.el7.x86_64
微内核(micro kernel):Windows, Solaris
每种功能使用一个单独子系统实现
tree /lib/modules/3.10.0-693.el7.x86_64/
模块文件:/lib/modules/VERSION-release
lsmod | grep e1000 //网卡模块
modprobe -r e1000 //卸载网卡模块
1、POST加电自检
POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
按次序查找引导设备,第一个有引导程序的设备为本次启动设备
bootloader: 引导加载器,引导程序
windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
LILO:LInuxLOader(很早以前centos5淘汰)
GRUB: GRand Unified Bootloader(翻译:大统一引导)
GRUB 0.X: GRUB Legacy,GRUB2
rpm -qi grub //这个包 centos5,6 是0.9版本 centos7 2.2版本
2、MBR引导
MBR:
446: bootloader,64: 分区表, 2: 55AA(标记位)
3、GRUB
GRUB:
primary boot loader : 1st stage,1.5 stage
secondary boot loader :2nd stage,分区文件
1st stage ---> 446: bootloader //二进制
1.5 stage ---> /boot/brub //二进制
hexdump -C -n 512 /dev/sda //查看前512字节
2nd stage --->
4、加载内核
kernel:自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序(借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问,并加载相应的硬件驱动
ramdisk--> ramfs提高速度
CentOS 5: initrd(ramdisk 访问磁盘)
工具程序:mkinitrd
CentOS 6,7: initramfs(filesystem 文件系统)
工具程序:mkinitrd, dracut
系统初始化:POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(systemd)
ramdisk文件的制作:
(1) mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
mkinitrd initramfs-`uname -r`.img `uname -r`
(2) dracut命令
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-`uname -r`.img `uname -r`
/usr/bin/mkinitrd //这个文件
initramfs
光盘启动 CD-ROM Drive
救援模式 Rescue installed system
chroot /mnt/sysimage/ 切换跟
执行:mkinitrd initramfs-uname -r
.img uname -r
exit
重启完成
init程序的类型:
SysV: init, CentOS 5之前
配置文件:/etc/inittab
[root@centos6 ~]#rpm -qf /sbin/init
SysVinit-2.86-15.e15(红帽开发)
按顺序执行
Upstart: init,CentOS6
配置文件:/etc/inittab, /etc/init/*.conf
[root@centos6 ~]#ll /sbin/init
-rwxr-xr-x. 1 root root 150352 May 11 2016 /sbin/init
[root@centos6 ~]#rpm -qf /sbin/init
upstart-0.6.5-16.el6.x86_64(ubuntu)
没有依赖关系 可以同时并行启动
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system
/etc/systemd/system
/etc/inittab //全部是注释濒临淘汰
[root@centos7 ~]#ll /usr/sbin/init
lrwxrwxrwx. 1 root root 22 Nov 9 13:20 /usr/sbin/init -> ../lib/systemd/systemd
全部并行启动
/sbin/initCentOS6之前
运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机
1:单用户模式(root自动登录), single, 维护模式
2:多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别:3, 5
切换级别:init#
查看级别:runlevel; who -r
init读取其初始化文件:/etc/inittab
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
捕获某个关键字顺序
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty
在运行级别5初始化X
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process
action:
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,此处一般为指定
/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
id:3:initdefault: //这里是几模式
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3 //就执行这里那个文件脚本
l6:6:wait:/etc/rc.d/rc 6
centos6 /etc/rc.d/ 目录下
/etc/inittab
设置系统默认的运行级别
id:3:initdefault:
示例:破解CentOS5和6的root口令
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
/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) 清理操作
说明:rcN --> 意味着读取/etc/rc.d/rcN.d
/K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
for srvin /etc/rc.d/rcN.d/K*; do
$srv stop
done
for srvin /etc/rc.d/rcN.d/S*; do
$srv start
done
chkconfig命令
查看服务在所有级别的启动或关闭设定情形:
chkconfig[--list] [name]
添加:
SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig--add name
#!/bin/bash
#LLLL 表示初始在哪个级别下启动,-表示都不启动
# chkconfig: LLLL nnnn
删除:chkconfig--del name
修改指定的链接类型
chkconfig[--level levels] name <on|off|reset>
--level LLLL: 指定要设置的级别;省略时表示2345
ntsysv 命令查看当前模式是否启动
ntsysv --level=3 查看3模式的
chkconfig --list atd 查看所有模式对这个模式开还是关
chkconfig --level 35 atd off 把3和5模式atd模式关掉
chkconfig atd off 默认是改的2 3 4 5
chkconfig --list 所有的服务
#! /bin/bash
# chkconfig: 35 99 00 //3和5模式是on 99编号最后打开服务 00优先关闭服务
# description: this is a test service
case $1 in
start)
touch /app/testsrv
echo testsrv is starting
sleep 5 // 开机时为了能看到这个服务
;;
stop)
rm -f /app/testsrv
echo testsrv is stopped
;;
restart)
echo testsrv is stopped
echo testsrv is starting
;;
status)
[ -f /app/testsrv ] && echo testsrv is running || echo testsrv is stopped
;;
esac
chmod +x testsrc 添加执行权限
chkconfig --add testsrv 添加到服务列表中
chkconfig --list testsrv 查看所有模式对这个模式开还是关
service 命令:手动管理服务
service 服务start|stop|restart
service --status-all
瞬态(Transient)服务被xinetd进程所管理
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
与libwrap.so文件链接
用chkconfig控制的服务:chkconfigtftpon