간단 한 로그 인, 대량 실행 명령, 대량 copy 파일 셸 스 크 립 트 [Linux 운영 의 길 스 크 립 트 사례]

 
    이름: satool      PS: (동료 들 을 바보 토끼 라 고 부 를 수 있 습 니 다)
    기능: 이 스 크 립 트 는 명령 을 대량으로 실행 하고 파일 을 복사 하 며 간단하게 로그 인 할 수 있 습 니 다. 서버 의 구체 적 인 IP 를 기억 하지 않 아 도 바로 로그 인 할 수 있 습 니 다.
    설명: 그룹 을 나 누 어 대량 관리 할 수 있 습 니 다. 단일 스 레 드 는 각 그룹 에 백 대의 장 치 를 사용 하지 않 습 니 다. (사용 하 셔 도 됩 니 다. 결 과 를 되 돌려 주 는 시간 이 길 고 짧 은 문 제 를 기다 리 는 것 입 니 다)
    용법: 비밀번호 없 이 ssh 로 로그 인 해 야 합 니 다.그룹 관리 이기 때문에 그룹 설정 파일 이 필요 합 니 다. /tools/function-all-ips (이름 은 스스로 정할 수 있 지만, 다음 스 크 립 트 는 이 프로필 을 참조 해 야 합 니 다) 프로필 형식
log_server="10.88.1.78 10.88.1.47 192.168.3.117"
lvs="192.168.1.141 192.168.1.142"

    그룹 이름 = "IP IP IP IP”  이런 격식
 
    도구 매개 변수:
  • -l      간이 로그 인 모드    satool -l  그룹 이름 코드:
    [root@tools-server sbin]# satool -l lvs
    1) 192.168.1.141
    2) 192.168.1.142
    选择要连接的服务器编号(Ctrl+C退出):
    1 또는 2 만 입력 하면 됩 니 다. 바로 로그 인 할 수 있 습 니 다. LVS 의 구체 적 인 IP 가 얼마 인지 기억 할 필요 가 없습니다
  • -g   대량 실행 명령 [색인 추가 가능] 명령 은 satool 이 필요 합 니 다. -g  그룹 이름  "cmd"  "num"(선택 가능) 코드:
    [root@tools-server sbin]# satool -g lvs "df -h"
    192.168.1.141
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
    13G  6.9G  5.5G  56% /
    /dev/sda1              99M   13M   82M  14% /boot
    tmpfs                1006M     0 1006M   0% /dev/shm
    192.168.1.142
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
    13G  6.9G  5.5G  56% /
    /dev/sda1              99M   13M   82M  14% /boot
    tmpfs                1006M     0 1006M   0% /dev/shm
  •         이 기능 은 대부분 회사 에 있 습 니 다. 그러나 우 리 는 이런 상황 이 있 습 니 다. 예 를 들 어 모든 업무 서버 의 설정 파일 을 수 정 했 습 니 다. 서버 는 20 대 입 니 다. 저 는 한꺼번에 다시 시작 할 수 없습니다. 그러면 업무 에 영향 을 줄 수 있 습 니 다. 우 리 는 먼저 5 개의 관찰 을 다시 시작 하고 문제 가 없 으 면 모두 다시 시작 해 야 합 니 다.이 문 제 를 해결 하기 위해 서 -g 네 번 째 인자 가 추가 되 었 습 니 다. 바로... 이다 색인 (따옴표 필요), 예 를 들 어 WWW 그룹 에는 15 대의 기계 가 있 는데 나 는 앞의 5 대의 부하 상황 만 볼 수 있다.
            코드:
     
    [root@tools-server sbin]# satool  -l www
    1) 192.168.1.2      6) 192.168.1.166  11) 192.168.7.187  16) 192.168.7.153
    2) 192.168.1.3      7) 192.168.3.1    12) 192.168.7.149  17) 192.168.7.154
    3) 192.168.1.4      8) 192.168.10.6   13) 192.168.7.150  18) 192.168.7.155
    4) 192.168.1.5      9) 192.168.7.185  14) 192.168.7.151
    5) 192.168.1.164   10) 192.168.7.186  15) 192.168.7.152
    选择要连接的服务器编号(Ctrl+C退出):
    [root@tools-server sbin]# satool  -g  www "w"  "3"
    192.168.1.2
    23:47:34 up 57 days,  8:48,  0 users,  load average: 0.00, 0.01, 0.00
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    192.168.1.3
    23:47:34 up 57 days,  8:48,  0 users,  load average: 1.04, 0.70, 0.66
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    192.168.1.4
    23:47:34 up 57 days,  8:48,  0 users,  load average: 3.29, 1.34, 0.84
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

       색인 매개 변 수 는 마이너스, 즉 역방향 선택 도 지원 할 수 있 습 니 다.
            코드:
     
    [root@tools-server sbin]# satool  -g  www "w"  "-3"
    192.168.7.155
    23:50:36 up 164 days, 21:52,  0 users,  load average: 0.80, 0.40, 0.24
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    192.168.7.154
    23:50:36 up 168 days, 11 min,  0 users,  load average: 0.11, 0.23, 0.19
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    192.168.7.153
    23:50:37 up 160 days,  6:02,  0 users,  load average: 0.91, 0.33, 0.21
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

        비 연속 적 인 선택 도 지원 할 수 있 습 니 다.
            코드:
    [root@tools-server sbin]# satool  -g  www "w"  "1 4 6"
    192.168.1.2
    23:51:37 up 57 days,  8:52,  0 users,  load average: 0.00, 0.00, 0.00
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    192.168.1.5
    23:51:37 up 57 days,  9:34,  0 users,  load average: 0.00, 0.01, 0.00
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    192.168.1.166
    23:51:37 up 301 days, 11:22,  0 users,  load average: 0.17, 0.31, 0.48
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

      3. -cp   로 컬 파일 을 원 격 서버 에 대량으로 보 냅 니 다 (단 방향) [색인 추가 가능] 
            satool -cp 그룹 이름 src  dest    "num"(선택 가능)
            코드
     
    [root@tools-server tmp]# satool  -cp lvs shdmt.txt  /tmp/
    192.168.1.141
    shdmt.txt                                                                     100% 4973     4.9KB/s   00:00
    192.168.1.142
    shdmt.txt                                                                     100% 4973     4.9KB/s   00:00

    주요 기능 은 바로 상기 와 같 습 니 다. 다른 기능 은 모두 보조 적 입 니 다. 다음은 전체 코드 총 300 여 줄 이 고 약간 비대 합 니 다. 토론 최적화 에 오신 것 을 환영 합 니 다.
     
    #!/bin/bash
    ##2012-11-21#######
    ##make by G.M######
    ##version 3.0######
    red="\033[31m"
    end="\033[0m"
    yel="\033[33m"
    pur="\033[35m"
    #function-all-ips DIR##
    . /tools/function-all-ips
    ll=`cat /tools/function-all-ips |awk -F = '{print $1}' |grep -v '#'`
    grop () {
    if  [ -z "$app" ]
    then
    echo -e "${yel}$ll${end}"|xargs -n 4 |sed 's/ /\]  \[/g'|sed 's/^/\[/g'|sed 's/$/\]/g'
    elif [ -z "$cmd" ]
    then
    echo $ll |grep -w  $app > /dev/null
    if [ $? -eq 0 ]
    then
    eval   echo  '$'$app |xargs -n 1
    else
    echo -e "${red} 输入的组不在  function-all-ips!! $end"
    fi
    elif [ $# -eq 2 ]
    then
    for ip in  `eval   echo "$"$app`
    do
    echo -e "$red $ip $end"
    ssh $ip "$cmd"
    done
    elif [ $# -eq 3 ]
    then
    total=`eval   echo  '$'$app |wc -w`
    tmpnum=`echo $num|wc -w`
    shuzu=(`eval   echo "$"$app`)
    echo $num | egrep "[a-zA-Z]" >/dev/null 2>&1
    satus=$?
    if [ $satus -ne 0 ]
    then
    if [ $tmpnum -eq 1 ]   && [ ${num#-} -le $total  ]
    then
    if [ $num -gt 0 ]
    then
    for s in `seq 0 $(($num-1))`
    do
    ip=${shuzu[$s]}
    echo -e "$red $ip $end"
    ssh $ip "$cmd"
    done
    elif [ $num -lt 0 ]
    then
    num=${num#-}
    rshuzu=(`eval   echo "$"$app |xargs -n 1|tac|xargs`)
    for s in `seq 0 $(($num-1))`
    do
    ip=${rshuzu[$s]}
    echo -e "$red $ip $end"
    ssh $ip "$cmd"
    done
    fi
    elif [ $tmpnum -gt 1 ]
    then
    for s in $num
    do
    if [ $s -le $total ];then
    ip=${shuzu[$(($s-1))]}
    echo -e "$red $ip $end"
    ssh $ip "$cmd"
    else
    echo "$s is more than  $app total"
    fi
    done
    else
    echo "$num is more than  $app total"
    fi
    else
    echo "$num is not number"
    fi
    fi
    }
    ip () {
    if  [  -z "$app"  ]
    then
    echo -e "${yel}$ll${end}"|xargs -n 4 |sed 's/ /\]  \[/g'|sed 's/^/\[/g'|sed 's/$/\]/g'
    else
    echo "$app" | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' >/dev/null
    stat=$?
    if [ "$stat" -eq 0 ]
    then
    ping -c 1  $app > /dev/null
    if [ "$?" -eq 0 ]
    then
    if [ -z "$cmd"  ]
    then
    echo -e "${red} 缺少命令 参数 !!! $end"
    elif [ $# -eq 2 ]
    then
    echo -e "$red $app  $end"
    ssh $app "$cmd"
    fi
    else
    echo -e "${red}$app 网络不可达${end}"
    fi
    else
    echo -e "${red}无效的IP输入${end}"
    fi
    fi
    }
    SSH () {
    if  [ -z "$app" ]
    then
    echo -e "${yel}$ll${end}"|xargs -n 4 |sed 's/ /\]  \[/g'|sed 's/^/\[/g'|sed 's/$/\]/g'
    else
    echo $ll |grep -w  $app > /dev/null
    if [ $? -ne 0 ]
    then
    echo -e "${red} 输入的组不在  function-all-ips!! $end"
    else
    PS3="选择要连接的服务器编号(Ctrl+C退出):"
    lt=`eval echo "$"$app`
    select ip in   $lt
    do
    ssh $ip
    break
    done
    fi
    fi
    }
    fort () {
    pid=$$
    for i in $ll
    do
    lt=`eval echo "$"$i`
    cat << EOF >>/tmp/$pid.log
    $i () {
    select a in $lt
    do
    ssh \$a
    break
    done
    }
    EOF
    done
    . /tmp/$pid.log
    rm /tmp/$pid.log
    PS3="Select group (Ctrl+C to exit):"
    select ip in   $ll
    do
    PS3="Select server: "
    $ip
    break
    done
    }
    search () {
    if [ -z $app ];then
    echo '-s is search mode'
    echo 'please input IP '
    else
    echo "$app" | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' >/dev/null
    stat=$?
    if [ "$stat" -eq 0 ]
    then
    echo $app
    grep -w $app /tools/function-all-ips |awk -F '=' '{print $1}'
    else
    echo  "无效的IP"
    fi
    fi
    }
    cps () {
    if  [ -z "$app" ]
    then
    echo -e "${yel}$ll${end}"|xargs -n 4 |sed 's/ /\]  \[/g'|sed 's/^/\[/g'|sed 's/$/\]/g'
    elif [ ! -z $app ]  && [ -z $sfile ]  || [ ! -f $sfile ]
    then
    echo $ll |grep -w  $app > /dev/null
    if [ $? -eq 0 ]
    then
    echo -e "源文件未指定或不存在!!"
    eval   echo  '$'$app |xargs -n 1
    else
    echo -e "${red} 输入的组不在  function-all-ips!! $end"
    fi
    elif [ $# -eq 3 ]
    then
    for ip in  `eval   echo "$"$app`
    do
    echo -e "$red $ip $end"
    scp  $sfile  $ip:$dfile
    done
    elif [ $# -eq 4 ]
    then
    total=`eval   echo  '$'$app |wc -w`
    tmpnum=`echo $num|wc -w`
    shuzu=(`eval   echo "$"$app`)
    echo $num | egrep "[a-zA-Z]" >/dev/null 2>&1
    satus=$?
    if [ $satus -ne 0 ]
    then
    if [ $tmpnum -eq 1 ]   && [ ${num#-} -le $total  ]
    then
    if [ $num -gt 0 ]
    then
    for s in `seq 0 $(($num-1))`
    do
    ip=${shuzu[$s]}
    echo -e "$red $ip $end"
    scp  $sfile  $ip:$dfile
    done
    elif [ $num -lt 0 ]
    then
    num=${num#-}
    rshuzu=(`eval   echo "$"$app |xargs -n 1|tac|xargs`)
    for s in `seq 0 $(($num-1))`
    do
    ip=${rshuzu[$s]}
    echo -e "$red $ip $end"
    scp  $sfile  $ip:$dfile
    done
    fi
    elif [ $tmpnum -gt 1 ]
    then
    for s in $num
    do
    if [ $s -lt $total ];then
    ip=${shuzu[$(($s-1))]}
    echo -e "$red $ip $end"
    scp  $sfile  $ip:$dfile
    else
    echo "$s is more than  $app total"
    fi
    done
    else
    echo "$num is more than  $app total"
    fi
    else
    echo "$num is not number"
    fi
    fi
    }
    case $1 in
    -i)
    shift
    app=$1
    shift
    cmd=$*
    ip $app "$cmd"
    ;;
    -g)
    shift
    app=$1
    shift
    cmd=$1
    shift
    num=$1
    if [ -z "$num"  ];then
    grop $app  "$cmd"
    else
    grop $app "$cmd" "$num"
    fi
    ;;
    -cp)
    shift
    app=$1
    shift
    sfile=$1
    shift
    dfile=$1
    shift
    num=$1
    if [ -z "$num" ]
    then
    if [ -z $sfile ] || [ -z $dfile ]
    then
    cps $app
    else
    cps $app "$sfile" "$dfile"
    fi
    else
    if [ -z $sfile ] || [ -z $dfile ]
    then
    echo
    cps $app
    else
    cps $app "$sfile" "$dfile"  "$num"
    fi
    fi
    ;;
    -l)
    shift
    app=$1
    SSH $app
    ;;
    -a)
    fort
    ;;
    -s)
    shift
    app=$1
    search
    ;;
    *)
    echo "$0 [-i|-g]"
    echo "-i IP cmd"
    echo "-g group cmd [index] 经常用"
    echo "-cp group src dest [index]"
    echo "-s search mode"
    echo "-l group   (ssh usage) 常用"
    echo "-a 堡垒机模式."
    ;;
    esac

         면책 성명: 도 구 를 사용 하 는 것 은 자원 적 인 선택 입 니 다. 만약 에 Liux 의 하 드 인용 과 소프트 인용 에 정통 하지 않 은 학생 이 라면 작은 따옴표 와 작은 따옴표 가 있 는 조합 명령 을 사용 하지 마시고 마스크 * (별표) 를 사용 하지 않도록 하 십시오. 사용 할 때 전의 여 부 를 고려 해 야 합 니 다. 만약 에 이 도 구 를 사용 하면 저 자 는 책임 을 지지 않 습 니 다.

    좋은 웹페이지 즐겨찾기