Linuxshell脚本批量登录机器执行命令

Linuxshell脚本批量登录机器执行命令

2023年8月2日发(作者:)

Linuxshell脚本批量登录机器执⾏命令0x00:场景:  服务器管理员,管理的机器是⼏⼗、⼏百、⼏千数量级别的,  当某些情况下,只能登录ssh命令⾏去执⾏命令时,难道要⼿⼯?当然不是,肯定是要脚本⾃⼰去登录执⾏命令。0x01:脚本需要⽤到expect命令,安装⽅法# yum -y install expect  0x02:执⾏命令脚本,auto_search_#!/bin/bash## file name : auto_search_## 判断输⼊参数个数为0,提⽰并退出if [ $# -eq 0 ];then echo -e "nUsage: nt sh $0 commandn" exitfi## 判断 ip_ ⽂件是否存在,不存在提⽰并退出if [ ! -e ip_ ];then echo -e "nError: Not "ip_" filen" exitfi## 以下, ip_lists_和ip_lists_任⼀⽂件内容为空## 则ip_lists_⽂件也为空## 插⼊内容随意,但最好是IP格式,防⽌奇怪问题## 写127.0.0.1和127.0.0.2只是区分在什么状态下执⾏的##判断ip_lists_⽂件是否存在,不存在则创建if [ -e ip_lists_ ];then ## ⽂件存在,且内容为空则插⼊内容127.0.0.2 count_comple=`wc -l ip_lists_|awk '{print $1}'` if [ ${count_comple} -eq 0 ];then

echo "127.0.0.2" >ip_lists_ fielse ##⽂件不存在则创建,并插⼊内容127.0.0.1 echo "127.0.0.1" >ip_lists_##判断ip_lists_⽂件是否存在,不存在则创建if [ -e ip_lists_ ];then ## ⽂件存在,且内容为空则插⼊内容127.0.0.2 count_black=`wc -l ip_lists_|awk '{print $1}'` if [ ${count_black} -eq 0 ];then

echo "127.0.0.2" >ip_lists_ fielse ##⽂件不存在则创建,并插⼊内容127.0.0.1 echo "127.0.0.1" >ip_lists_## 传⼊要执⾏的命令sh_cmd=$1## 过滤ip_lists_⿊名单⾥IP和ip_lists_已经执⾏过的IP## 未执⾏的IP放到ip_lists_ ip_ |grep -v "`cat ip_lists_`" |grep -v "`cat ip_lists_`" > ip_lists_## 将多⾏,合并成⼀⾏,⽤空格分隔ip_lists=`cat ip_lists_ | tr "n" " "`## 遍历IP列表并执⾏命令for ip_list in ${ip_lists}do ## 提⽰ echo -e "n---------- Currect_IP=${ip_list} -----------------" echo "Currect_IP=${ip_list}" ## 获取密码列表⾥的密码,tail -1 要最后⼀个,是最新的密码 ip_passwd=`grep ${ip_list} /home/test/get_password/pwd_ |tail -1 | awk -F ":" '{print $2}'` ## 如过密码为空,则调⽤get_⽂件匹配密码 if [ -z ${ip_passwd} ];then echo "Currect_IP=${ip_list} Password is NULL." cd /home/zxl/auto_get_password/ ## 传⼊当前IP匹配密码 sh auto_get_ ${ip_list} ## 等待1秒,让缓存写⼊⽂件 sleep 1 ## 回到原⽬录 cd - ## 再次获取密码 ip_passwd=`grep ${ip_list} /home/test/get_password/pwd_ |tail -1 | awk -F ":" '{print $2}'` fi

echo "" ## 给expect传⼊IP 、密码来执⾏命令。 记录⽇志tee -a $,$0当前脚本的名字 expect auto_search_ ${ip_list} ${ip_passwd} "${sh_cmd}" | tee -a $ ## search completes ip to file ## 记录执⾏完成的IP,防⽌脚本异常退出,下次启动重头开始执⾏ echo "${ip_list}" >> ip_lists_

done## 全部执⾏完成,则删除ip_lists_⽂件echo "[ info ] rm ip_lists_"rm ip_lists_## 提⽰,执⾏命令完成echo "[ OK ] Exec command done"

  *注:auto_get_如何匹配密码,查看另⼀篇⽂章 0x03:执⾏命令expect脚本auto_search_#!/usr/bin/expect## file name : auto_search_## 检查传⼊参数不等于3个,提⽰并退出if { $argc != 3 } { #send_user "Usage: expect $argv0 IP Passwd cmd" puts "nUsage: ntexpect $argv0 IP Passwd cmdn" exit}## 传⼊3个参数赋值set ip [lindex $argv 0]set passwd [lindex $argv 1]set cmd [lindex $argv 2]## ⽤root⽤户执⾏cmd变量⾥命令spawn ssh root@$ip "$cmd"expect { ## 提⽰信息⾥有yes/no 发送yes "yes/no" {send "yesr";exp_continue} ## 提⽰信息⾥有password 发送密码 "*password*" {send "$passwdr"}}send_user "n"expect eofsend_user "n"  0x04: 远程调⽤ 因为某些原因,本地执⾏脚本访问IP会有限制,⽐如“安全⼈员”只允许员⼯机器登录很少的IP⽹段,但是服务可以访问所有⽹段。   我们可把get_⽂件放到服务的某个路径下,我们从本地传参给服务器调⽤。 这⾥我们把上⾯的get_脚本,放到服务器上test⽤户的"家"⽬录下,绝对路径/home/test/auto_search_file/auto_search_⽂件名:l_auto_search_#!/bin/bash## file name : l_auto_search_ct 50_auto_search_ "$1" | tee -a $⽂件名:50_auto_search_ (因为IP⾥带50,所以⽂件名前⾯加了50好区分)#!/usr/bin/expect## file name : 50_auto_search_## 获取传⼊的参数set cmd [lindex $argv 0]set cmd_temp "cd auto_search_file && sh auto_search_ '$cmd'"

set password "test123"## ⽤ssh⽅式登录,并执⾏cmd_temp⾥命令## expect语法⾥,要执⾏的命令必须要能够“”括起来,⽐如"$cmd_temp"spawn ssh test@192.168.1.50 "$cmd_temp" expect "*password" {send "$passwordn"}expect eof  0x05:使⽤本地使⽤:# sh auto_search_ "ls -l"远程调⽤:# sh l_auto_search_ "ls -l"

-

发布者:admin,转转请注明出处:http://www.yc00.com/news/1690920630a463840.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信