脚本登陆操作多台机器

环境

生产环境有多台机器,又要经常巡检,因为没有集群管理,每次都要登陆普通用户,然后切换root用户,然后敲操作命令,挺费时间的。我这里有9台服务器,而且巡检项目相差不多,主要查看cpu、内存和磁盘空间,所以还是做了脚本处理,减少相同工作任务操作。

处理方式

通过expect匹配操作,这样就可以实现脚本登陆服务器操作,expect在centos系统上默认不带有,需要安装rpm包
在这里插入图片描述

主脚本命令

采用一个脚本,然后调用一个信息表,主要用到expect和数组操作。下面是主脚本,然后source调用信息表,然后for循环操作不同机器,数组操作中一定是和信息表中对应,不然变量错误报错。expect简单说明,前面三个是代码块与exp_continue配合,意思是从两个中匹配到一个就会执行下一条send操作,不需要等待5秒(set timeout 5)。

!/bin/bash
#
source /root/expect/hostinfo
name_pt=${login_name[0]}
name_root=${login_name[1]}
cmd_pt="\~\]\$"
echo ${login_str[0]}

hostinfo()
{
host_cell=$(eval echo \${$1[0]})
pt_passwd=$(eval echo \${$1[1]})
ro_passwd=$(eval echo \${$1[2]})
commond1=$(eval echo \${$1[3]})
commond2=$(eval echo \${$1[4]})
commond3=$(eval echo \${$1[5]})
commond4=$(eval echo \${$1[6]})
commond5=$(eval echo \${$1[7]})
commond5=$(eval echo \${$1[8]})
}

for (( i=1;i<=9;i++ ))
do

hostinfo host$i
echo -e "\n\n\n主机host$i$host_cell 开始检查-----"

/usr/bin/expect <<EOF
set timeout 5
spawn ssh $name_pt@$host_cell

expect {  
"yes/no" { send "yes\r"; exp_continue }  
"password:" { send "$pt_passwd\r" }  
} 
expect {
"password:" { send "$pt_passwd\r"; exp_continue }
"login:" { send "su -\r"}
}
expect {
"密码:" { send "$ro_passwd\r"; exp_continue }  
"Password:" { send "$ro_passwd\r" }
}
expect "login:" { send "\r"}
expect "*]#" 
send "$commond1\r"
send "$commond2\r"
send "$commond3\r"
send "$commond4\r"
send "$commond5\r"
send "exit\r"
send "exit\r"
expect eof  
EOF
done

信息表

这里已经做了裁剪,信息表基本由数组组成,然后被前面脚本调用其信息。

#!/bin/bash
#DATE:20200528
#AUTHER:xiao

login_name=(
"huhu"		#普通用户名
"root"			#root用户名
)

login_passwd=(
"N@#123"		#普通用户密码1
"G@123A"		#普通用户密码2
"N@12#$"		#root用户密码1
"T@1234"		#root用户密码2
)

st_command=(
"df -h | grep -v /var"															#0df检查磁盘空间
"top -bn 1|head -n 5"															#1top检查cpu和men
"docker ps |grep -v NAMES "														#2检查docker是否在运行
"ps -ef | grep -E 'Base\|PowerRT\|HbaseSer' | grep -v grep | wc -l"				#3查看几个程序是否在运行
"netstat -anot | grep 9092"														#4查看kafka程序是否在运行
"ps -ef | grep -E 'RTServer\|calcd3\|ScadaServer\|fep\|alarmd\|alarmsave' "		#5查看几个程序是是否在运行
"cd /home/work/t5000/jiancha && sh data_jiancha.sh && jiankong.log"				#6进入目录调用写好的脚本和查看定时任务记录的日志
)

host1=(
"10.15.52.12"			#主机IP
"${login_passwd[0]}"	#普通用户密码1
"${login_passwd[2]}"	#root用户密码1
"${st_command[0]}"		#df检查磁盘
"${st_command[1]}"		#top查看
"${st_command[2]}"		#查看docker
)

host2=(
"10.15.52.19"			#主机IP
"${login_passwd[1]}"	#普通用户密码1
"${login_passwd[2]}"	#root用户密码1
"${st_command[0]}"		#df检查磁盘
"${st_command[1]}"		#top查看
"${st_command[2]}"		#查看docker
)

成果

执行后通过tee写入日志中,最后日志效果如图,图中就是通过命令登陆其他服务器,然后查看数据。因为要记录到表格,这日志还不算是我最终需求,但这已经已经大大减少了很多麻烦。
在这里插入图片描述

脚本进阶

最终需求是要填写表格,如图要巡检服务器的状态及应用状态。
在这里插入图片描述
单是上面获取到的信息难免有点视觉疲劳,所以在脚本上加入对返回的信息处理。
以下是增加处理内容后的脚本,在原有显示磁盘等信息上,增加了对密码是否过期做判断处理,以便定期修改密码。对应的hostinfo文件也已经修改,这里就不贴出,处理脚本仅供参考。

#!/bin/bash
#DATETIME:2020.06.04
#ATHOR:XiaoShaohuan
#OPTIONS:巡检集群多台服务并记录信息
cur_dir=$(pwd)
if [ ! -d /tmp/xunjian_log ];then
mkdir -p /tmp/xunjian_log
fi
cur_min=$(date "+%Y%m%d%H%M")				#获取当前分钟
tmp_file=/tmp/xunjian_log/$cur_min.log			#记录登陆信息全部日志
tmp_cell=/tmp/xunjian_log/cell.log			#处理过程产生日志
log_xunjian=$cur_dir/$cur_min.log			#处理后输出的日志
host_num=9						#主机数量,便于后面循环调用

source $cur_dir/hostinfo
name_pt=${login_name[0]}
name_root=${login_name[1]}
cmd_pt="\~\]\$"

echo "开始巡检并记录中..."
hostinfo()
{
host_cell=$(eval echo \${$1[0]})
pt_passwd=$(eval echo \${$1[1]})
ro_passwd=$(eval echo \${$1[2]})
commond1=$(eval echo \${$1[3]})
commond2=$(eval echo \${$1[4]})
commond3=$(eval echo \${$1[5]})
commond4=$(eval echo \${$1[6]})
commond5=$(eval echo \${$1[7]})
commond6=$(eval echo \${$1[8]})
commond7=$(eval echo \${$1[9]})
commond8=$(eval echo \${$1[10]})
commond9=$(eval echo \${$1[11]})
}

for (( i=1;i<=$host_num;i++ ))
do
hostinfo host$i
echo -e "\n\n\n主机host$i$host_cell 开始记录信息-----"

/usr/bin/expect <<EOF
set timeout 5
spawn ssh $name_pt@$host_cell

expect {  
"yes/no" { send "yes\r"; exp_continue }  
"password:" { send "$pt_passwd\r" }  
} 
expect {
"password:" { send "$pt_passwd\r"; exp_continue }
"login:" { send "su -\r"}
}
expect {
"密码:" { send "$ro_passwd\r"; exp_continue }  
"Password:" { send "$ro_passwd\r" }
}
expect "login:" { send "\r"}
expect "*]#" 
send "$commond1\r"
send "$commond2\r"
send "$commond3\r"
send "$commond4\r"
send "$commond5\r"
send "$commond6\r"
send "$commond7\r"
send "$commond8\r"
send "$commond9\r"
send "exit\r"
send "exit\r"
expect eof  
EOF
done >>$tmp_file


echo "日志输出处理中..."
for (( i=1;i<=$host_num;i++ ))
do
sed -n '/'主机host"$i"/,/主机host"$[i+1]"'/p' $tmp_file > $tmp_cell
host_ip=$(eval echo \${host$i[0]})
echo -e "\e[0;32m主机地址\e[0m$host_ip"
#这里都是处理登陆获取的信息加工处理
echo -e "\e[0;32m当前cpu使用情况:\e[0m"
sed -n '/top -bn/,/~]/ p' $tmp_cell | awk -F ":" '/load average/{print $NF}' |sed -e 's/[[:space:]]//g;s/,/\n/g' 
echo -e "\e[0;32m当前men(内存)使用情况:\e[0m"
sed -n '/top -bn/,/~]/ p' $tmp_cell | awk '/KiB Mem/{printf "%.2f%\n",($8/$4)*100}'
echo -e "\e[0;32m磁盘占用最大为:\e[0m"
sed -n '/df -h/,/~]/ p' $tmp_cell | grep "[0-9]%" |awk '{print $5}' | sort -nr | head -n 1 
#获取docker信息并列出
echo -e "\e[0;32m当前运行docker名称及总数:\e[0m"
com_xx1=$(sed -n '/docker ps/,/~]/p' $tmp_cell | grep -v "~]\|NAMES")
#判断是否为空并返回结果
if [ "$com_xx1" = "" ];then
echo "无"
else
echo -e "$com_xx1"
fi
printf "\e[0;32m总数:\e[0m"
#判断是否为空,空的赋值后为0 
com_xx2=$(sed -n '/docker ps/,/~]/p' $tmp_cell | grep -v "~]\|NAMES" | wc -l )
echo $com_xx2
echo -e "\e[0;32m其他信息:\e[0m"
sed -n '/Base|PowerRT|HbaseSe/,/~]/p' $tmp_cell | sed '$d'
sed -n '/grep 9092/,/~]/p' $tmp_cell | sed '$d' 
sed -n '/RTServer|calcd3|/,/~]/p' $tmp_cell | sed '$d'
sed -n '/data_jiancha.sh/,/~]/p' $tmp_cell | sed '$d'

#提醒用户密码过期及系统时间是否正确
cur_day=$(date +%Y%m%d)
sys_time=$(sed -n '/timedatectl/,/~]/p' $tmp_cell | awk '/Local time/{print $4" "$5}')
sys_day=$(date -d "$sys_time" +%Y%m%d)
if [ $cur_day == $sys_day ];then
#huhu用户过期时间获取
huhu_exp=$(sed -n '/chage -l huhu/,/~]/p' $tmp_cell | awk -F ":" '/Password expires/{print $2}')
huhu_time=$(date -d "$huhu_exp" +%Y%m%d 2>/dev/null )     #转换时间,错误忽略
if [ $? -eq 0 ];then
  if [ $huhu_time -gt $cur_day ];then
    if (( huhu_time >= cur_day-30 ));then
	time_diff_th=$((($(date -d "$huhu_time" +%s)-$(date -d "$cur_day" +%s))/3600/24))
    echo -e "huhu密码还有$time_diff_th天即将过期,请修改huhu密码并更新hostinfo"
    fi
  else
  echo "密码已过期!!!"
  fi
fi
#root用户过期时间获取
root_exp=$(sed -n '/chage -l root/,/~]/p' $tmp_cell | awk -F ":" '/Password expires/{print $2}')
root_time=$(date -d "$root_exp" +%Y%m%d 2>/dev/null )     #转换时间,错误忽略
if [ $? -eq 0 ];then
  if [ $root_time -gt $cur_day ];then
    if (( root_time >= cur_day-30 ));then
	time_diff_ro=$((($(date -d "$root_time" +%s)-$(date -d "$cur_day" +%s))/3600/24))
    echo -e "root密码还有$time_diff_ro天即将过期,请修改root密码并更新hostinfo"
    fi
  else
  echo "密码已过期!!!"
  fi
fi
echo -e "\e[0;32mhuhu密码过期时间:\e[0m$huhu_exp"
echo -e "\e[0;32mroot密码过期时间:\e[0m$root_exp"
else
echo -e "主机$host_cell时间错误"
fi

echo -e "\n"
cat /dev/null > $tmp_cell
done >> $log_xunjian

echo "处理完毕!"

脚本处理后显示如图
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值