• shell 脚本同时对远程多台机器执行命令


    脚本1:需要机器之间免密

    ssh-copy-id [-i [identity_file]] [user@]machine
    #!/bin/bash
    # -------------------------------------------------------------------------------
    # Author:   Loya.Chen
    # Description: Execute commands on multiple remote hosts at the same time.
    # -------------------------------------------------------------------------------
    set -e
    Usage() {
      echo "Usage: $0 host1 host2 ... 'command'"
    }
    if [ $# -lt 2 ] ;then
      Usage
      exit 0
    else
      cmd=${!#}
    fi
    logfile=$(mktemp)
    i=1
    success=0
    failed=0
    for ip in $@;do
      if [ $i -eq $# ];then
        break
      fi
      ssh $ip $cmd &> $logfile
      if [ $? -eq 0 ];then
        #((success++))
        success=$(($success+1))
        echo -e "
    33[32m$ip | success 33[0m 
    "
        cat $logfile
      else
        ((failed++))
        echo -e "
    33[31m$ip | failed 33[0m
     "
        cat $logfile
      fi
      ((i++))
    done
    echo -e '
    -------------------------'
    echo -e "33[32msuccess: $success | failed: $failed 33[0m"
    echo '-------------------------'

    方法2:这种方式可以不用免密,但是需要在执行命令的机器用户名和密码一致

    #!/bin/bash
    # -------------------------------------------------------------------------------
    # Author:   JiangTao.Yu
    # Description: Execute commands on multiple remote hosts at the same time.
    # -------------------------------------------------------------------------------
    set -e
    Usage() {
      echo "Usage: $0 host1 host2 ... 'command'"
    }
    if [ $# -lt 2 ] ;then
      Usage
      exit 0
    else
      cmd=${!#}
    fi
    logfile=$(mktemp)
    i=1
    success=0
    failed=0
    for ip in $@;do
      if [ $i -eq $# ];then
        break
      fi
      sshpass -p "mypasswd" ssh -o "StrictHostKeyChecking no" hduser@$ip $cmd &> $logfile
      if [ $? -eq 0 ];then
        #((success++))
        success=$(($success+1))
        echo -e "
    33[32m$ip | success 33[0m 
    "
        cat $logfile
      else
        ((failed++))
        echo -e "
    33[31m$ip | failed 33[0m
     "
        cat $logfile
      fi
      ((i++))
    done
    echo -e '
    -------------------------'
    echo -e "33[32msuccess: $success | failed: $failed 33[0m"
    echo '-------------------------'

     方法3、从文件读取ip、username、passwd

    #!/bin/bash
    set -e
    success=0
    failed=0
    while read  ip username passwd
    do
       ip=$ip
       username=$username
       passwd=$passwd
       sshpass -p $passwd  ssh -n -o "StrictHostKeyChecking no" $username@$ip "free -m"
       if [ $? -eq 0 ];then
          success=$(($success+1))
          echo -e "
    33[32m$ip | success33[0m
    " 
       else
           failed=$(($failed+1))
           echo -e "
    33[32m$ip | failed33[0m
    " 
       fi
    
    done < ip_user_passwd.txt
    echo -e '
    -------------------------'
    echo -e "33[32msuccess: $success | failed: $failed 33[0m"
    

     

    [root@test ~]# cat ip_user_passwd.txt
    192.168.0.235   hduser  mypasswd
    192.168.4.50    root    123456
    192.168.4.50    root    123456
    

      

    借鉴:https://www.jb51.net/article/119541.htm

  • 相关阅读:
    VS 高级版本新建的项目如何降级使低版本 VS 可以打开
    Windows下安装VScode,并使用,以及中文配置
    使用Cadence绘制PCB流程
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    如何对Redis设置密码,提高安全性
    关于redis启动流程介绍
    Redis笔记,安装和常用命令
    阿里云主机(aliyun-Linux) x64安装Redis详解
    几款开源的图形化Redis客户端管理软件
    redis配置文件redis.conf中文版(基于2.4)
  • 原文地址:https://www.cnblogs.com/yjt1993/p/10283110.html
Copyright © 2020-2023  润新知