批量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
在集群上分别测试了一些情况,对结果还是相当满意的。当然还是希望路过的大神可以指教,让这个小脚本更加完善。
在我的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 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- 动态清空 nohup 输出文件
- install scrapy with pip and easy_install
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝
- vivi下重新调整分区
- Linux VS Unix:Linux欲一统天下 Unix不死
- linux下设定环境变量