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
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
((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:端口