功能实现主要有以下几个细节:
(1)如何循环输出IP地址
(2)如何在telnet进远程后继续执行脚本命令
(3)如何判断IP地址是否可telnet成功,并且不影响后面正式telnet执行
(4)如何将执行结果输入不同文件
(5)单引号和双引号区别不大,但反引号不可混用
(6)如何在Linux系统中定时执行脚本或命令
创建脚本文件a.sh,并赋予执行权限:
vi a.sh
chmod +x a.sh
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是为了保证上一条命令执行完后,才会执行下一条命令,并在执行后退出
执行命令:
#执行脚本,并将脚本执行的所有结果(无论执行成功还是失败)都输入到日志文件a.log中
sh /usr/local/etc/a.sh 2>&1 | tee /usr/local/etc/a.log
去掉执行内容日志a.log中的多余字符:
#但由于linux系统和远程中的转行符不同,输出的日志文件会带“^M”,可以在脚本文件a.sh的最后加上
sed -i 's/\r//g' /usr/local/etc/a.log #去掉^M
wait
例如:
执行显示结果:
(1)控制台显示
(2)执行内容日志:a.log
(3)执行成功日志:aa.log
(4)执行失败日志:aaa.log
(5)汇总日志:aaaa.log
备注:每执行一次记得删除之前产生的日志文件
设置系统定时任务,打开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
备注:定时任务执行,最好使用此脚本的绝对路径,保证有效执行