您的位置:首页 > 运维架构 > Shell

批量SCP文件的脚本

2014-02-27 16:19 369 查看
最近在集群上部署Hadoop时发现在服务器之间传递文件比较麻烦,原因是使用scp每次只能指定一台目标服务器,并且必须指定用户名和目标路径。当集群中存在很多服务器时,分发Hadoop的配置文件就会耗费很大的时间,虽然没有技术挑战性,但却令人乏味。都说程序员是比较懒惰的物种,为了以后减少复制文件时的枯燥,决定写一个批量拷贝文件的脚本,当然是基于SCP命令的。

在我的Hadoop集群中,所有的用户名和密码是一致的,为了减少敲打键盘时出错的可能性,或者将懒惰进行到底,该脚本支持只输入一次用户名即可。考虑到集群中的目录层级也是一致的,也支持目标路径一致,还支持对目录的复制,其余scp的高级特性就不打算实现了。

那下面就对该脚本语法做个简单的介绍。语法比较简单,主要遵循上述偷懒的原则,具体如下:

语法一,以相同的用户名、目标名称复制文件: bscp -ut[r] sourceDir user targetDir host1 host2…

语法二,以相同的用户名、不同的目标名称复制文件: bscp -u[r] sourceDir user host1:targetDir1 host2:target2…

语法三,不同的用户名、相同的目标名称复制文件: bscp -t[r] sourceDir targetDir user1@host1 user2@host2…"

语法四,用户名、目标名称均不同: bscp [-r] sourceDir user1@host1:targetDir1 user2@host2:targetDir2…

相信大家都能够很容易地看懂语法格式,就不再赘述了,下面直接展现代码:

#!/bin/sh

print_usage()
{
echo "语法一,以相同的用户名、目标名称复制文件: bscp -ut[r] sourceDir user targetDir host1 host2…"
echo "语法二,以相同的用户名、不同的目标名称复制文件: bscp -u[r] sourceDir user host1:targetDir1 host2:target2…"
echo "语法三,不同的用户名、相同的目标名称复制文件: bscp -t[r] sourceDir targetDir user1@host1 user2@host2…"
echo "语法四,用户名、目标名称均不同: bscp [-r] sourceDir user1@host1:targetDir1 user2@host2:targetDir2…"
}
argNumber=$#
# 如果没有参数则打印使用方法
if [ $argNumber -le 1 ]; then
print_usage
exit 1
fi

COMMAND=$1
#shift

case $COMMAND in
(--help|-help|-h|help)
print_usage
exit 0
;;
esac

if [ "${COMMAND:0:1}" != "-" ];then
shift
args="$@"
for i in $args
do
scp $COMMAND $i
done
else
length=${#COMMAND}
#echo $length
if [ $length -eq 4 ]; then
shift
if [ $# -le 3 ];then
print_usage
exit 1
fi
source=$1
targetUser=$2
targetDir=$3
shift 3
args="$@"
for i in $args
do
scp -r $source $targetUser@$i:$targetDir
#echo $targetUser
done
elif [ $length -eq 3 ]; then
shift
source=$1
if [ `expr index "$COMMAND" r` -eq 0 ]; then
if [ $# -le 3 ]; then
print_usage
exit 1
fi
targetUser=$2
targetDir=$3
shift 3
args="$@"
for i in $args
do
scp $source $targetUser@$i:$targetDir
done
else
if [ `expr index "$COMMAND" u` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetUser=$2
shift 2
args="$@"
for i in $args
do
scp -r $source $targetUser@$i
done
elif [ `expr index "$COMMAND" t` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetDir=$2
shift 2
args="$@"
for i in $args
do
scp -r $source $i:$targetDir
done
else
print_usage
exit 1
fi
fi
elif [ $length -eq 2 ]; then
shift
source=$1
if [ `expr index "$COMMAND" u` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetUser=$2
shift 2
args="$@"
for i in $args
do
scp $source $targetUser@$i
done
elif [ `expr index "$COMMAND" t` -gt 0 ]; then
if [ $# -le 2 ]; then
print_usage
exit 1
fi
targetDir=$2
shift 2
args="$@"
for i in $args
do
scp $source $i:$targetDir
done
elif [ `expr index "$COMMAND" r` -gt 0 ]; then
if [ $# -le 1 ]; then
print_usage
exit 1
fi
shift 1
args="$@"
for i in $args
do
scp -r $source $i
done
else
print_usage
exit 1
fi
else
print_usage
exit 1
fi
fi

在集群上分别测试了一些情况,对结果还是相当满意的。当然还是希望路过的大神可以指教,让这个小脚本更加完善。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux shell scp 批量 脚本