shell批量执行命令与文件传输脚本

shell批量执行命令与文件传输脚本

需求:

对未进行主机信任操作的服务器进行批量操作

实现:

由于ssh只能在交互模式中输入服务器密码进行登录登操作,不便于进行大批量服务器进行巡检或日志采集。sshpass恰好又解决了这个问题,使用ssh -p passwd可以实现命令行输入密码操作,便于进行规模巡检

脚本使用方法:

  1. 首先需要在脚本执行机器上安装sshpass,可以使用yum进行安装

    # yum方式安装
    yum -y install sshpass
  2. tools.sh脚本以及使用方式

    #!/bin/bash
    # 利用sshpass实现对服务器进行批量操作
    arg_num=$#
    file=$2
    cmd=$4
    c1=$1
    c3=$3
    c4=$4
    c5=$5
    c6=$6
    function main(){
    if [ $arg_num -ne 4 ] && [[ $c1 != "-f" ]]
    then
    errorMessage
    exit 1
    elif [[ $c3 = "-c" ]]
    then
    valus
    doCommand
    elif [[ $c3 = "-l" ]] && [[ $c5 = "-s" ]]
    then
    # sh tools.sh -f hostlist -l hostlist -s /home/
    # scp -P 22022 hostlist 192.168.1.1:/home
    valus
    doScpLocalToServer
    elif [[ $c3 = "-s" ]] && [[ $c5 = "-l" ]]
    then
    valus
    doScpServerToLocal
    else
    errorMessage
    fi
    }
    function doScpLocalToServer(){
    for ip in $iplist
    do
    for_num=`expr $for_num + 1`
    pd=`echo $passwordlist | awk -v k=$for_num '{print $k}'`
    echo -e "\033[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- \033[0m"
    sshpass -p $pd scp -r -P 22022 $c4 root@$ip:$c6
    echo "$ip 文件传输完毕"
    done
    }
    function doScpServerToLocal(){
    for ip in $iplist
    do
    for_num=`expr $for_num + 1`
    pd=`echo $passwordlist | awk -v k=$for_num '{print $k}'`
    echo -e "\033[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- \033[0m"
    sshpass -p $pd scp -r -P 22022 root@$ip:$c4 $c6
    echo "$ip 文件传输完毕"
    done
    }
    function doCommand(){
    echo "do $cmd"
    for ip in $iplist
    do
    for_num=`expr $for_num + 1`
    pd=`echo $passwordlist | awk -v k=$for_num '{print $k}'`
    echo -e "\033[32m ->->->->->->->->->->$ip<-<-<-<-<-<-<-<-<-<- \033[0m"
    sshpass -p $pd ssh -p22022 root@$ip "$cmd"
    done
    }
    function errorMessage(){
    echo -e "\033[31m 脚本使用有误!!! \033[0m"
    echo -e "\033[33m
    -f 本地hostlist文件名,第一列为ip,第二列为服务器密码
    -c 远程执行的命令,如使用特殊符号,需要添加转义符
    -s 远程服务器文件路径
    -l 本地服务器文件路径
    举个栗子 :
    1.批量执行命令
    sh tools.sh -f hostlist -c \"hostname\"
    2.批量文件拷贝
    sh tools.sh -f hostlist -l /home/aaa.txt -s /opt/ #将本地/home/aaa.txt 文件传输至列表服务器的/opt/目录下
    sh tools.sh -f hostlist -s /var/log/messages -l /tmp/ #列表服务器的/var/log/messages日志文件拷贝到本地/tmp/目录下
    \033[0m "
    }
    function valus(){
    if [ -f "$file" ]; then
    iplist=`awk '{print $1}' $file`
    passwordlist=`awk '{print $2}' $file`
    for_num=0
    else
    echo -e "\033[31m 请检查文件是否存在 !!! \033[0m"
    exit 4
    fi
    }
    main

使用方式

213

举个例子

1. 远程执行命令

[root@zhq-study zhq]# sh tools.sh -f hostlist -c "hostname"
do hostname
->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-
slave-01
->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-
slaves-02

注意:如果远程命令中含有特殊字符,需要使用转义字符(\),如下所示:

# 错误方式
[root@zhq-study zhq]# sh tools.sh -f hostlist -c "ifconfig | awk 'NR==2{print $2}'"
do ifconfig | awk 'NR==2{print }'
->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-
inet 192.168.8.11 netmask 255.255.255.0 broadcast 192.168.8.255
->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-
inet 192.168.8.12 netmask 255.255.255.0 broadcast 192.168.8.255
# 正确方式,
[root@zhq-study zhq]# sh tools.sh -f hostlist -c "ifconfig | awk 'NR==2{print \$2}'"
do ifconfig | awk 'NR==2{print $2}'
->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-
192.168.8.11
->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-
192.168.8.12

2. 执行文件拷贝

- 将本地`/home/test.conf` 文件传输至列表服务器的`/opt/`目录下
```sh
[root@zhq-study zhq]# sh tools.sh -f hostlist -l /home/test.conf -s /opt/
->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-
192.168.8.11 文件传输完毕
->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-
192.168.8.12 文件传输完毕
[root@zhq-study zhq]#
```
- 列表服务器的`/var/log/messages`日志文件拷贝到本地`/root/`目录下
```sh
[root@zhq-study zhq]# sh tools.sh -f hostlist -s /var/log/messages -l /root/
->->->->->->->->->->192.168.8.11<-<-<-<-<-<-<-<-<-<-
192.168.8.11 文件传输完毕
->->->->->->->->->->192.168.8.12<-<-<-<-<-<-<-<-<-<-
192.168.8.12 文件传输完毕
[root@zhq-study zhq]#
```
posted @   整天就会哈哈哈  阅读(720)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示