批量SCP文件的脚本

最近在集群上部署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

在集群上分别测试了一些情况,对结果还是相当满意的。当然还是希望路过的大神可以指教,让这个小脚本更加完善。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skyWalker_ONLY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值