1、在/bin/目录下,创建mscp,再给mscp文件加执行权限: chmod +x mscp
    内容:
    #!/usr/bin/env bash
    #/bin/mscp
    CONFIG_FILE=/etc/server.list
    DEFAULT_PORT=22
    function usage()
    {
    more << eof
    syntax: $0 <”src”>
    iplist IP 列表
    e.g. 1. 192.168.3.23
    2. 192.168.3.23..27:22022
    3. 192.168.3.23..27:22022,192.168.3.36..40
    4. 预定义IP列表 $CONFIG_FILE :
    服务列表
    bid 竞价日志服务器
    dc data center 服务器
    had hadoop 集群服务器
    机架列表
    rackall 所有机架上的服务器
    rack0309 机架 03-09 上的服务器
    rack0402 机架 04-02 上的服务器
    src 多个源文件需要使用双引号括起来,在 shell 脚本识别时,使之被当做一个参数来处理;
    如果要使用通配符 ,也需要使用双引号括起来
    e.g. 1. mscp test file /tmp/
    2. mscp test “file1 file2” /tmp/
    3. mscp test “file
    “ /tmp/
    dst 远程目录,只能填一个
    e.g. $0 192.168.3.23..27:22022,192.168.3.36..40 /data/www /data/
    eof
    }
    # 如果输入的是关键字,而非 IP 列表,
    # 则读取配置文件并打印对应的 IP 列表。
    function parseConfigFile()
    {
    source $CONFIG_FILE
    local key=$1
    eval local value=’$’${key}_server
    echo $value
    }
    # 调用一次,解析一个形如 192.168.0.10..20:22022 的 IP 列表
    # 如果有多列表,请循环调用
    function getIp()
    {
    local iplist=$1
    # 分割 IP 和 PORT
    if [[ $iplist = : ]]
    then
    local ips=$(echo $iplist | cut -d “:” -f 1)
    local port=$(echo $iplist | cut -d “:” -f 2)
    else
    local port=$DEFAULT_PORT
    fi
    # 打印所有的 IP
    prefix=$(echo $ips | cut -d ‘.’ -f 1-3)
    subfix=$(echo $ips | cut -d ‘.’ -f 4-6)
    subfix_begin=$(echo $subfix | cut -d ‘.’ -f 1)
    subfix_end=$(echo $subfix | cut -d ‘.’ -f 3)
    if [ -z $subfix_begin ] ||
    [ -z $subfix_end ] ||
    [ $subfix_begin -gt $subfix_end ] ||
    [ $subfix_begin -gt 255 ] ||
    [ $subfix_end -gt 255 ]
    then
    echo “error input : $ips”
    exit 1
    else
    for((i=$subfix_begin; i<=$subfix_end;i++))
    do
    echo $prefix.$i:$port
    done
    fi
    }
    # 解析形如 ip1,ip2,… 的IP 列表
    function parseIp()
    {
    local iplist=$1
    # 把 IP 之间的逗号都转换成空格,以便符合 for 循环格式
    for ips in $(echo $iplist | sed ‘s/\,/\ /g’)
    do
    getIp $ips
    done
    }
    # scp 本地文件到远程主机
    function mscp()
    {
    local key=$1
    local src=$2
    local dst=$3
    echo “ips: $key”
    echo “src: $src”
    echo “dst: $dst”
    echo $key | grep -E “^[0-9]” > /dev/null
    if [ $? -eq 0 ]; then
    local iplist=$key
    else
    local iplist=$(parseConfigFile $key)
    fi
    if [ -z $iplist ]||[ “$iplist” == “” ]; then
    echo “error: no IP list in config file ‘$CONFIG_FILE’ named ‘$key’”
    exit 1
    fi
    local n=0
    for ipt in $(parseIp $iplist)
    do
    trap ‘echo -e “\nSTOPPED BY “; exit’ 2
    ((n++))
    local ip=$(echo $ipt | cut -d “:” -f 1)
    local port=$(echo $ipt | cut -d “:” -f 2)
    echo -e “\n\033[32m$n. $ip\033[0m”
    scp -o StrictHostKeyChecking=no -P $port -r $src $ip:$dst
    done
    }
    # main ########################################################################
    if [ $# -ne 3 ]
    then
    usage
    exit 1
    fi
    mscp $1 “$2” $3
    2、在/etc目录下,新建server.list文件
    内容:
    agent_server=192.168.10.231:22,192.168.10.232:22,192.168.10.233:22
    #组名=ip:端口