expect 是由Don Libes基于 Tcl( Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助 expect 处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。
expect中相关命令:
1.spawn 启动新的进程
2.expect 从进程接收字符串
3.send 用于向进程发送字符串
4.interact 允许用户交互
5.exp_continue 匹配多个字符串在执行动作后加此命令
yum install -y expect #安装expect工具
vim expect #编写脚本
#!/usr/bin/expect
spawn ssh 10.0.0.27
expect {
"yes/no" { send "yesn";exp_continue }
"password" { send "123456n" }
}
interact
chmod +x expect #加执行权限
[root@localhost ~]# ./expect #执行脚本 spawn ssh 10.0.0.27 root@10.0.0.27's password: Last login: Tue Oct 12 17:28:04 2021 from 10.0.0.372.shell脚本
root@ubuntu18:~# vim expect.sh #创建脚本
#!/bin/bash ip=$1 user=$2 password=$3 expect < root@ubuntu18:~# ./expect.sh 10.0.0.18 root 123456 #执行脚本 spawn ssh root@10.0.0.18 root@10.0.0.18's password: Last login: Wed Oct 13 18:39:14 2021 from 10.0.0.15 [root@Centos8 ~]# hostname -I 10.0.0.18 [root@Centos8 ~]# exit logout Connection to 10.0.0.18 closed.二、生成10个随机数保存于数组中,并找出其最大值和最小值。[root@localhost ~]# vim /data/test.sh #创建脚本#!/bin/bash declare -i max min declare -a nums for ((i=0;i<10;i++)); do nums[$i]=$RANDOM [ $i -eq 0 ] && min=${nums[0]} && max=${nums[0]} && continue [ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue [ ${nums[$i]} -lt $min ] && min=${nums[$i]} done echo "All numbers are ${nums[*]}" echo "max is $max" echo "min is $minroot@localhost ~]# chmod +x /data/test.sh [root@localhost ~]# bash /data/test.sh All numbers are 21422 23688 29183 11171 31409 12852 3167 14693 19163 11236 max is 31409 min is 3167[root@localhost ~]# bash -x /data/test.sh #观察命令执行过程
三、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序[root@localhost ~]# vim /data/test2.sh #创建脚本 [root@localhost ~]# chmod +x /data/test2.sh 添加执行权限#!/bin/bash A=$1 #定义位置参数,可使得随机产生的A个随机数进行排序 declare -a number for ((i=0;i' ${number[$next]} fi done echo "第$i次整理后得:${number[*]}" done echo "after sort:${number[*]}"[root@localhost ~]# bash /data/test2.sh 10 #执行结果 before sort:4354 6840 21822 31236 20564 27357 3180 16260 12728 10304 6840 -----> 4354 21822 -----> 4354 31236 -----> 4354 20564 -----> 4354 27357 -----> 4354 16260 -----> 3180 12728 -----> 3180 第1次整理后得:6840 21822 31236 20564 27357 4354 16260 12728 3180 10304 21822 -----> 6840 31236 -----> 6840 20564 -----> 6840 27357 -----> 6840 16260 -----> 4354 12728 -----> 4354 第2次整理后得:21822 31236 20564 27357 6840 16260 12728 4354 3180 10304 31236 -----> 21822 27357 -----> 20564 16260 -----> 6840 12728 -----> 6840 第3次整理后得:31236 21822 27357 20564 16260 12728 6840 4354 3180 10304 27357 -----> 21822 第4次整理后得:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304 第5次整理后得:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304 第6次整理后得:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304 第7次整理后得:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304 第8次整理后得:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304 第9次整理后得:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304 after sort:31236 27357 21822 20564 16260 12728 6840 4354 3180 10304四、总结查看系统负载的几种命令,总结top命令的指标Linux系统状态的查看及管理工具:
1.进程树 pstreepstree 可以用来显示进程的父子关系,以树形结构显示。
范例: pstree [OPTION] [ PID | USER ] -p 显示PID -T 不显示线程thread,默认显示线程 -u 显示用户切换 -H pid 高亮显示指定进程及其前辈进程[root@Centos8 ~]# pstree -pH 25822.进程信息 psps 即 process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中。
ps格式ps [OPTION]...常用选项: a 选项包括所有终端中的进程 x 选项包括不链接终端的进程 u 选项显示进程所有者的信息 f 选项显示进程树,相当于 --forest k|--sort 属性 对属性排序,属性前加 - 表示倒序 o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem L 显示支持的属性列表 -C cmdlist 指定命令,多个命令用,分隔 -L 显示线程 -e 显示所有进程,相当于-A -f 显示完整格式程序信息 -F 显示更完整格式的进程信息 -H 以进程层级格式显示进程相关信息 -u userlist 指定有效的用户ID或名称 -U userlist 指定真正的用户ID或名称 -g gid或groupname 指定有效的gid或组名称 -G gid或groupname 指定真正的gid或组名称 -p pid 显示指pid的进程 --ppid pid 显示属于pid的子进程 -t ttylist 指定tty,相当于 t -M 显示SELinux信息,相当于Z#查询你拥有的所有进程 ps -x #显示指定用户名(RUID)或用户ID的进程 ps -fU apache ps -fU 48 #显示指定用户名(EUID)或用户ID的进程 ps -fu wang ps -fu 1000 #查看以root用户权限(实际和有效ID)运行的每个进程 ps -U root -u root #列出某个组拥有的所有进程(实际组ID:RGID或名称) ps -fG nginx #列出有效组名称(或会话)所拥有的所有进程 ps -fg mysql ps -fg 27 #显示指定的进程ID对应的进程 ps -fp 1234 #以父进程ID来显示其下所有的进程,如显示父进程为1234的所有进程 ps -f --ppid 1234 #显示指定PID的多个进程 ps -fp 1204,1239,1263 #要按tty显示所属进程 ps -ft pts/0 #以进程树显示系统中的进程如何相互链接 ps -e --forest #以进程树显示指定的进程 ps -f --forest -C sshd ps -ef --forest | grep -v grep | grep sshd #要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列 ps -fL -C nginx #要列出所有格式说明符 ps L #查看进程的PID,PPID,用户名和命令 ps -eo pid,ppid,user,cmd #自定义格式显示文件系统组,ni值开始时间和进程的时间 ps -p 1234 -o pid,ppid,fgroup,ni,lstart,etime #使用其PID查找进程名称: ps -p 1244 -o comm= #要以其名称选择特定进程,显示其所有子进程 ps -C sshd,bash #查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用 ps -C httpd,sshd -o pid= #检查一个进程的执行时间 ps -eo comm,etime,user | grep nginx #排序,查找占用最多内存和CPU的进程 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head #显示安全信息 ps -eM ps --context3.负载查询 uptime/proc/uptime 包括两个值,单位 s
系统启动时长
空闲进程的总时长(按总的CPU核数计算)[root@Centos8 ~]# cat /proc/uptime 22002.86 41701.44uptime 和 w 显示以下内容
当前时间
系统已启动的时间
当前上线人数
系统平均负载(1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报)系统平均负载: 指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题。[root@Centos8 ~]# uptime 23:21:03 up 6:02, 2 users, load average: 0.05, 0.05, 0.16 [root@Centos8 ~]# uptime w 23:21:06 up 6:02, 2 users, load average: 0.05, 0.05, 0.16 [root@Centos8 ~]# w 23:21:21 up 6:02, 2 users, load average: 0.04, 0.04, 0.16 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.0.1 17:30 5:49m 0.00s 0.00s -bash root pts/1 10.0.0.1 23:07 1.00s 0.03s 0.00s w4.显示CPU相关统计mpstat[root@Centos8 ~]# mpstat Linux 4.18.0-240.el8.x86_64 (Centos8.3.2.magedu.org) 10/13/2021 _x86_64_ (2 CPU) 11:33:12 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:33:12 PM all 0.03 0.01 0.10 0.00 0.09 0.03 0.00 0.00 0.00 99.75 [root@Centos8 ~]# mpstat 1 3 Linux 4.18.0-240.el8.x86_64 (Centos8.3.2.magedu.org) 10/13/2021 _x86_64_ (2 CPU) 11:33:39 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 11:33:40 PM all 0.00 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.50 11:33:41 PM all 0.00 0.00 0.00 0.00 0.50 0.00 0.00 0.00 0.00 99.50 11:33:42 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 Average: all 0.00 0.00 0.00 0.17 0.17 0.00 0.00 0.00 0.00 99.675.查看进程实时状态toptop 提供动态的实时进程状态,有许多内置命令
帮助:h 或 ? ,按 q 或esc 退出帮助 排序: P:以占据的CPU百分比,%CPU M:占据内存百分比,%MEM T:累积占据CPU时长,TIME+ 首部信息显示: uptime信息:l命令 tasks及cpu信息:t命令 cpu分别显示:1 (数字) memory信息:m命令 退出命令:q 修改刷新时间间隔:s 终止指定进程:k 保存文件:Wtop命令栏位信息简介
us:用户空间 sy:内核空间 ni:调整nice时间 id:空闲 wa:等待IO时间 hi:硬中断 si:软中断(模式切换) st:虚拟机偷走的时间五、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!" 1. for循环[root@localhost ~]# vim test3.sh #!/bin/bash ip=192.168.0 for id in {1..254};do { ping -c1 -w1 $ip.$id &> /dev/null && echo "ping $ip.$id is success" || echo "ping $ip.$id is fail " }& #发送一个包,等待1秒,加上&即让所有进程并行执行,提高了效率。 done wait #等待在后台启动的所有子进程结束2.while循环[root@localhost ~]# vim test4.sh #!/bin/bash net=192.168.0 declare -i A A=1 while [ $A -lt 255 ]; do if ping -W1 -c1 $net.$A >& /dev/null;then echo"ping $net.$A is sucess" else echo "ping $net.$A is fail" fi let A++ done wait六、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间 1.创建脚本[root@localhost ~]# vim backup.sh #!/bin/bash backdir="/backup" filename_tar="etcbak-"`date -d "-1 days" +%Y-%m-%d-%H`".tar.gz" filename_log="etcbak-"`date -d "-1 days" +%Y-%m-%d-%H`".log" [ -d $backdir ] || mkdir -p /backup tar zcvf /$backdir/$filename_tar /etc > /$backdir/$filename_log 2>&1 #z表示只备份目录下的文件不包括目录[root@localhost ~]# ./backup.sh [root@localhost ~]# cd /backup/ [root@localhost backup]# ls etcbak-2021-10-13-13.log etcbak-2021-10-13-13.tar.gz2.将备份脚本添加至任务计划[root@localhost ~]# crontab -e #编辑计划任务 [root@localhost ~]# crontab -l #查看计划任务 30 1 * * 1-5 /root/backup.sh



