ssh 批量停止 systemctl 服务

[root@master01 scripts]# mkdir log
[root@master01 scripts]# cat config.txt
192.168.206.5 |nginx tomcat
192.168.206.6 |minio
#/bin/bash

## 验证用户密码
IP=192.168.206.6
while true
do
   read -p "请输入用户:" user
   echo -n "请输入密码:"
   read -s  passwd
   echo $
   read -p "请输入端口号:" port

   sshpass -p $passwd ssh -p $port $user@$IP "hostname" >/dev/null 2>&1
   if [ $? -eq 0 ];then
      break;
   else
      echo "登录失败,重新输入"
   fi
done

time=$(date +"%Y-%m-%d-%H:%M:%S")
isContinue=y

# 检查服务
check(){
sshpass -p $passwd ssh -p $port $user@$a "$d" > ./log/temp.log 2>&1
cat ./log/temp.log >>./log/$time.log 2>&1
if [ ! -z "`cat ./log/temp.log|grep -i running`" ];then
   echo "有服务未能停止,具体如下,请手动停止,具体详情在./log/$time.log"
   run=`cat ./log/temp.log|grep -i -n "running" |awk -F : {print $1}`
   for e in $run;do sed -n "`echo $(($e-2))`p" ./log/temp.log ;done
   echo "手动停止后,按y继续,按ctrl+c或者n退出"
else
   echo "停止$a服务器完毕,日志记录在./log/$time.log, 可以进行查看,无问题按y,有问题按ctrl+c或者n"
fi
}

# 停止服务
len=`cat ./config.txt|wc -l`

for ((i=1; i<=$len; i ++))
do
    echo $i
    a=`cat ./config.txt|awk -F | {print $1}|sed -n "$i"p`
    b=`cat config.txt|awk -F | {print $2}|sed -n "$i"p`
    c="for i in $b ;do systemctl stop $i --no-pager && sleep 2s;done"
    d="for i in $b ;do systemctl status $i --no-pager ;echo $;done"
    echo "停止$a服务器$b业务,请查看./log/$time.log"
    echo "               停止$a服务器$b业务              " >> ./log/$time.log
    sshpass -p $passwd ssh -p $port $user@$a "$c" >> ./log/$time.log 2>&1
    if [ $? -eq 0 ];then
        sleep 15s;
        check $a $b $d;
        while true
        do
            read -p continue?[y/n] isContinue
            if [ $isContinue == y ];then
                echo $i
                break;
            elif [ $isContinue == n ];then
                exit;
            else
                echo "输入错误请重新输入"
            fi
         done
    else
        echo "停止$a服务器异常,请查看./log/$time.log和检查ssh是否可连接"
        exit;
    fi
done
echo "所有服务停止完毕 "

问题解决

len=${#list_name[*]} # 数组的长度 name=${list_name[@]} # 列出所有的数组 for 循环 for ((i=0; i<=len; i ++)) do order=${list_order[i]} eval $order="for i in $name ;do systemctl stop $i --no-pager && sleep 5s;done" done i ++ : i=$(($i+1)) 如下这样,双引号中的$name 还是会获取变量name的数值,而其他的都是常量,不会进行bash a="for i in $name ;do systemctl stop $i --no-pager && sleep 5s;done" a=b $a=123 因为shell 不能二次进行解析,使用eval 字符串转数组 list_name=`cat service.txt` list_name=(${list_name//,/})
经验分享 程序员 微信小程序 职场和发展