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 

ssh 批量停止 systemctl 服务_第1张图片

 

字符串转数组

list_name=`cat service.txt`
list_name=(${list_name//,/})

你可能感兴趣的:(#,shell,linux,ssh,服务器)