第九节 shell场景化编程
状态查询类脚本解析
1、进程状态查询,这是我们之前写的一个进程查询类的脚本,当然输出被格式化成自动化运维平台自动识别的格式了
#!/bin/bash
#通用的进程查看,提取了最关键的几个维度
#process_name='mysqld'
SEP="@"
checkprocess(){
p_pids=`ps -aux |grep -v grep |grep $1|awk {'print $2'}`
echo "HOSTNAME${SEP}COMMAND${SEP}STAT${SEP}USER${SEP}PID${SEP}CPU${SEP}MEM${SEP}INFO"
if [ -z "$p_pids" ];then
echo "no found process"
else
for p_pid in $p_pids;
do
p_command=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $11" "$12'}`
p_stat=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $8'}`
p_user=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $1'}`
p_cpu=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $3'}`
p_mem=`ps -axu |grep -v grep |grep $1 |grep $p_pid |awk {'print $4'}`
# echo 'COMMAND,STAT,USER,PID,CPU,MEM,INFO'
echo "$HOSTNAME${SEP}$p_command${SEP}$p_stat${SEP}$p_user${SEP}$p_pid${SEP}$p_cpu${SEP}$p_mem${SEP}found process $1"
done
fi
}
#checkprocess $process_name
checkprocess @option.process_name@
上面的脚本是我们随手写的,其实也有很多不科学的地方,大家看下下面,对比下上面的哪里不够科学
SEP="@"
checkprocess(){
p_pids=`ps -aux |grep -v grep |grep $1|awk {'print $2'}`
echo "COMMAND${SEP}STAT${SEP}USER${SEP}CPU${SEP}MEM${SEP}PID${SEP}HOSTNAME${SEP}INFO"
if [ -z "$p_pids" ];then
echo "No found process"
else
for p_pid in $p_pids;
do
a=`ps -axu |grep $1 |grep $p_pid`#这里如果不单独给变量,会被awk带来未知影响,要测试好
echo $a |awk -v pid=$p_pid -v hostname=$HOSTNAME -v i="found telegraf" 'BEGIN{OFS="@"}{print $8,$1,$3,$4,pid,hostname,i}'
done
fi
}
#checkprocess $process_name
checkprocess telegraf
脚本需要和人来交互的
#!/bin/sh
read -p "pls input two num:" a b
if [ $a -lt $b ];then
echo "yes,$a less than $b"
exit
fi
if [ $a -eq $b ];then
echo "yes,$a eaual than $b"
exit
fi
if [ $a -gt $b ];then
echo "yes,$a greater than $b"
exit
fi
模拟交互登录类脚本解析
1.ssh实现自动登录并停在服务器上
#!/usr/bin/expect -f
set ip [lindex $argv 0 ] //接收第一个参数,并设置IP
set password [lindex $argv 1 ] //接收第二个参数,并设置密码
set timeout 10 //设置超时时间
spawn ssh root@$ip //发送ssh请求
expect { //返回信息匹配
"*yes/no" { send "yes\r"; exp_continue} //第一次ssh连接会提示yes/no,继续
"*password:" { send "$password\r" } //出现密码提示,发送密码
}
interact //交互模式,用户会停留在远程服务器上面.
2.ssh远程登录到服务器,并执行命令,执行完退出
#!/usr/bin/expect -f
set ip 192.168.1.130
set password admin
set timeout 10
spawn ssh root@$ip
expect {
"*yes/no" { send "yes\r"; exp_continue}
"*password:" { send "$password\r" }
}
expect "#*"
send "pwd\r"
send "exit\r"
expect eof
更多的脚本
###shell脚本常见的使用场景:
1安装类型脚本
我们可以使用shell脚本进行软件的安装,文件的创建等等写部署类的工作
2测试类型的脚本
我们可以使用脚本测试网络,测试性能,收集各种信息等信息收集类型的工作
3自动化类脚本和插件脚本
很多工具都可以使用脚本来作为插件,比如ansbile,saltstack,rundeck等等。或者直接写脚本放在contrab里面周期性执行等,这也是使用脚本的一个方面