trap命令用法:
https://blog.csdn.net/carolzhang8406/article/details/46504415/
https://www.doc88.com/p-582676609909.html
这部分打印内容比较重要
修改之后:
这里踩了两个坑:
1、数组比较大小,里面既有数字,又有字符串。
2、带有颜色的echo打印,漏写m,打印空字符串(或者是黑色字体也说不准)
下面是我的脚本,相对于上面图片,加了一些内容;
问题1;
knows_hosts文件里面并没有本地IP,也不可能会有。所以,数组赋值时,并没有给know[134]赋值,导致后面-eq比较时一直报错。
问题2:
漏写了m,导致echo打印错误-
#/bin/bash
#变量声明
nmap=`which nmap`
ssh_keygen=`which ssh-keygen`
ssh_copy_id=`which ssh-copy-id`
ifconfig=`which ifconfig`
user=muyang
pass=muyang
declare -a vm
declare -a know=0
declare -i i=0
lan_Ip=192.168.127.0
mask=24
#本地IP获取
local_ip=`$ifconfig ens33 | grep netmask | awk '{print $2}'`
#echo -e "\033[40;32m================信号捕捉开始====================\033[0m"
#trap "" HUT,INT,QUIT,TSTP
#扫描可以访问的主机
echo -e "\033[40;34m=======================开始搜索可以远程访问的主机=============\033[0m"
for own in $(cat /root/.ssh/known_hosts |cut -d " " -f 1 |cut -d "." -f 4)
do
echo "192.168.127.${own}......."
know[$own]=1
i=$(( $i+1 ))
done
echo
echo -e "\033[40;34m=======================搜索完毕=================================\033[0m"
#是否生成秘钥并发送给客户端
if [ $i -eq 0 ]
then
echo "检测到没有可访问的主机;是否要生成公钥并发送至远程客户端?(y/n)"
read option
case $option in
"y"|"yes")
$ssh_keygen
;;
"n"|"no")
echo -e "\033[40;33m若您无法解决当前问题,请联系管理员!!\033[0m"
exit
;;
*)
echo -e "\033[40;31m请根据提示信息输入您的选择!\033[0m"
;;
esac
else
echo -e "\033[40;32m检测到有可访问的主机,将进行下一步操作!\033[0m"
fi
#扫描同网段内存活主机
if [ $? -eq 0 ];then
#reset integer i
i=0
echo -e "\033[40;33m==================即将扫描同网段内存活主机====================\033[0m"
for ip_add in $(${nmap} -sP ${lan_Ip}/${mask} | grep report | grep -v 127.1$ | grep -v 127.2$ | grep -v 127.254$ | cut -d " " -f 5)
do
tial=`echo "$ip_add" | cut -d "." -f 4`
#echo $tial
#echo ${know[${tial}]}
if [ -z ${know[${tial}]} ]
then
know[${tial}]=0
fi
if [ ${know[${tial}]} -eq 0 -a "${ip_add}" != "${local_ip}" ]
then
echo -e "\033[40;33m ==================即将将公钥拷贝到主机${ip_add}上============="
$ssh_copy_id ${user}@$ip_add
vm[$i]=$ip_add
i=$(( $i+1 ))
echo -e "\033[40;32m ==================公钥拷贝成功============================\033[0m"
fi
done
#echo $i
test $i -gt 0 && echo -e "\033[40;32m=======所有主机拷贝完毕!================================\033[0m" || echo -e "\033[40;33m没有可以拷贝的主机\033[0m"
else
echo -e "\033[40;31m 公钥生成错误!!!\033[0m"
fi