SCP 파일 대량 스 크 립 트

최근 클 러 스 터 에 Hadoop 을 배치 할 때 서버 간 에 파일 을 전달 하 는 것 이 번 거 로 운 것 을 발 견 했 습 니 다. scp 를 사용 할 때마다 대상 서버 만 지정 하고 사용자 이름과 대상 경 로 를 지정 해 야 하기 때 문 입 니 다.클 러 스 터 에 많은 서버 가 존재 할 때 Hadoop 의 프로필 을 나 눠 주 는 데 많은 시간 이 걸 리 고 기술적 도전 성 은 없 지만 지루 하 다.프로그래머 는 게 으 른 종이 라 고 합 니 다. 나중에 파일 을 복사 할 때의 지루 함 을 줄 이기 위해 파일 을 대량으로 복사 하 는 스 크 립 트 를 쓰기 로 했 습 니 다. 당연히 SCP 명령 에 기반 한 것 입 니 다.
내 Hadoop 클 러 스 터 에 서 는 모든 사용자 이름과 비밀번호 가 일치 합 니 다. 키 보드 를 두 드 렸 을 때 오류 가 발생 할 가능성 을 줄 이거 나 게 으 름 을 끝까지 진행 하기 위해 서 는 사용자 이름 을 한 번 만 입력 하면 됩 니 다.클 러 스 터 의 디 렉 터 리 등급 도 일치 하고 목표 경로 도 일치 하 며 디 렉 터 리 복사 도 지원 하 며 나머지 scp 의 고급 특성 은 실현 되 지 않 습 니 다.
그럼 이 스 크 립 트 문법 에 대해 간단 한 소 개 를 하 겠 습 니 다.문법 이 비교적 간단 하 다. 주로 상술 한 게 으 름 피 우 는 원칙 에 따라 구체 적 으로 다음 과 같다.
문법 1, 같은 사용자 이름, 대상 이름 으로 파일 복사: bscp - ut [r] sourceDir user targetDir host 1 host 2...
문법 2, 같은 사용자 이름, 다른 대상 이름 으로 파일 복사: bscp - u [r] sourceDir user host1: targetDir 1 host2: target 2...
문법 3, 서로 다른 사용자 이름, 같은 대상 이름 복사 파일: bscp - t [r] sourceDir targetDiruser1@host1 user2@host2…"
문법 4, 사용자 이름, 대상 이름 이 다 릅 니 다: bscp [- r] sourceDiruser1@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

클 러 스 터 에서 각각 상황 을 테스트 해 보 았 지만 결과 에 대해 서 는 상당히 만 족 스 러 웠 다. 물론 지나 가 는 큰 신 이 가르쳐 주 셔 서 이 작은 각본 을 더욱 완벽 하 게 만 들 었 으 면 좋 겠 다.

좋은 웹페이지 즐겨찾기