Linux脚本定时循环执行telnet不同IP远程并输入命令

功能实现主要有以下几个细节:

(1)如何循环输出IP地址

(2)如何在telnet进远程后继续执行脚本命令

(3)如何判断IP地址是否可telnet成功,并且不影响后面正式telnet执行

(4)如何将执行结果输入不同文件

(5)单引号和双引号区别不大,但反引号不可混用

(6)如何在Linux系统中定时执行脚本或命令

  1. 创建脚本文件a.sh,并赋予执行权限:

vi a.sh
chmod +x a.sh
  1. a.sh脚本内容详解:

备注:也可以直接读取文本中的IP地址:https://blog.csdn.net/weixin_41549104/article/details/129425373?spm=1001.2014.3001.5502

#!/bin/bash
inputfile=in#建立命令输入管道
input1="ls;"
input2="exit;"

#读取列表中的IP,还可以换成直接读取文件,参考见另一篇文章
list=("10.8.16.153" "10.8.16.148" "10.8.16.130")
for ip in "${list[@]}";do
        rm -fr $inputfile
        mknod $inputfile p
        exec 8<>$inputfile
        #测试这个IP是否能telnet成功,telnet进去并进入交互模式快速退出,且不输出日志
        echo -e "\035quit" | telnet $ip 23 | grep Connected &>/dev/null
        #“$?”会获取上一句命令的返回值,当返回值等于0,telnet成功,则继续执行
        if [ $? = 0 ];then
            telnet $ip 23 <&8 &
            sleep 2
            echo $input1 >> $inputfile #可输入多条,按自己需求增减
            sleep 2 #睡眠时间是必须的,按情况增减,太短容易吃命令
            echo $input2 >> $inputfile
            sleep 1
            echo "执行成功!"
            echo -e `date +%F' '%T` $ip 执行成功! >> /usr/local/etc/aa.log
            echo "============================================================"
            #aa.log文件用于记录执行成功的IP以及时间
        else
            echo "执行失败..."
            echo -e `date +%F' '%T` $ip 执行失败... >> /usr/local/etc/aaa.log
            echo "============================================================"
            #aaa.log文件用于记录执行失败的IP以及时间
        fi
done
wait

#执行结果汇总到总记录日志文件,$1和$2都表示函数变量
function test(){
    for i in $(seq 1 $1) #$1表示文件的行号,例如$1=3,那么i取值是1-3
    do
      a=`sed -n $i\p $2` #必须用反引号“·”,$2表示文件名
      echo $a >> aaaa.log #一行行重新追加到新的文件中
    done
    wait
}

#判断文件是否存在
function ifexist(){
f=0
if [ -f $1 ];then #如果文件存在
  f1=`sed -n '$=' $1` #统计执行成功记录文本的行数
  test $f1 $1 #执行汇总函数
  else 
  f1=$f #如果文件不存在,则执行成功的记录日志行数直接记为0
fi
wait

if [ -f $2 ];then #如果文件存在
  f2=`sed -n '$=' $2` #统计执行失败记录文本的行数
  test $f2 $2 #执行汇总函数
  else
  f2=$f #如果文件不存在,则执行失败的记录日志行数直接记为0
fi
wait
}

ifexist "/usr/local/etc/aa.log" "/usr/local/etc/aaa.log" #执行函数

#aaaa.log用于记录汇总的IP执行情况
echo 执行成功总数: $f1 ";" 执行失败总数:$f2 >> /usr/local/etc/aaaa.log
wait

#注:wait是为了保证上一条命令执行完后,才会执行下一条命令,并在执行后退出
  1. 执行命令:

#执行脚本,并将脚本执行的所有结果(无论执行成功还是失败)都输入到日志文件a.log中
sh /usr/local/etc/a.sh 2>&1 | tee /usr/local/etc/a.log
  1. 去掉执行内容日志a.log中的多余字符:

#但由于linux系统和远程中的转行符不同,输出的日志文件会带“^M”,可以在脚本文件a.sh的最后加上
sed -i 's/\r//g' /usr/local/etc/a.log #去掉^M
wait

例如:

Linux脚本定时循环执行telnet不同IP远程并输入命令_第1张图片
  1. 执行显示结果:

(1)控制台显示

Linux脚本定时循环执行telnet不同IP远程并输入命令_第2张图片

(2)执行内容日志:a.log

Linux脚本定时循环执行telnet不同IP远程并输入命令_第3张图片

(3)执行成功日志:aa.log

Linux脚本定时循环执行telnet不同IP远程并输入命令_第4张图片

(4)执行失败日志:aaa.log

(5)汇总日志:aaaa.log

Linux脚本定时循环执行telnet不同IP远程并输入命令_第5张图片

备注:每执行一次记得删除之前产生的日志文件

  1. 设置系统定时任务,打开crontab -e,添加以下命令:

#每天凌晨2点执行此脚本
0 2 * * * sh /usr/local/etc/a.sh 2>&1 | tee /usr/local/etc/a.log
#每天凌晨1点半清除产生的日志文件
30 1 * * * find /usr/local/etc/ -type f -name '*.log' | xargs rm -f

备注:定时任务执行,最好使用此脚本的绝对路径,保证有效执行

你可能感兴趣的:(linux,运维,bash)