Skip to content

Instantly share code, notes, and snippets.

@i97506051502
Created December 16, 2011 02:48
Show Gist options
  • Save i97506051502/1484198 to your computer and use it in GitHub Desktop.
Save i97506051502/1484198 to your computer and use it in GitHub Desktop.
copy file (or directory) to server(s)
#!/bin/bash
########################################################################
#
# Name:
# copyagent.sh
#
# Description:
# copy file (or directory) to server(s)
#
# Last Modified:
# 2011/12/15
#
# Authored by Go Sato (ZOOM DESIGN Inc.)
#
########################################################################
# 関数定義
# ----------------------------------------------------------------------
function showUsage() {
echo "使用方法は以下のとおりです."
echo "./copy.sh -h コピー先の IP アドレス -f コピーするファイル名のフルパス ユーザー名"
echo "./copy.sh -h コピー先の IP アドレス -d コピーするディレクトリ名のフルパス ユーザー名"
echo "./copy.sh -l コピー先の IP アドレスのリストファイル -f コピーするファイル名のフルパス ユーザー名"
echo "./copy.sh -l コピー先の IP アドレスのリストファイル -d コピーするディレクトリ名のフルパス ユーザー名"
echo "! - IP アドレスのリストファイルは copyr.sh と同じディレクトリに配置してください。"
exit 1
}
function copyErrorCheck() {
if [ $? -eq 0 ]; then
echo 'コピーに成功しました.'
exit 0
elif [ $? -eq 1 ]; then
echo 'コピーに失敗しました.'
exit 1
fi
}
# 引数の個数チェック
# ----------------------------------------------------------------------
if [ $# -lt 5 ]; then
echo "引数が不足しています."
showUsage
elif [ $# -ge 6 ]; then
echo "引数が多過ぎます."
showUsage
else
# 変数の設定
# ----------------------------------------------------------------------
targetOption=$1
TARAGET=$2
# IP アドレスのリストの存在確認 カレントに ipAddressList.txt があるかチェック
# ----------------------------------------------------------------------
CurrentDir=`pwd`
if [ ! -e $CurrentDir/ipAddressList.txt ]; then
echo "カレントディレクトリに ipAddressList.txt がありません."
exit 1
else
# 第二引数が IP アドレスであるかどうかのチェック(不十分!)
# ----------------------------------------------------------------------
# IP アドレスかどうかを正規表現でチェックする Perl スクリプトを実行
#if [ $1 == '-h' ]; then
case $1 in
'-h' )
/usr/bin/perl ~/checkIfIpAddress.pl $2
if [ $? -eq 1 ]; then
echo "第二引数が IP アドレスではありません."
exit 1
fi
break ;;
'-l' )
break ;;
esac
objectOption=$3
OBJECT=$4
USER=$5
# ユーザーの存在確認
# ----------------------------------------------------------------------
echo "以下のユーザーにてコピーします."
id $5
if [ $? -eq 1 ]; then
echo $5 は、存在しないユーザーです.
exit 1
else
# SSH のポート番号
sshPortNum=12222
# ファイル(or ディレクトリ)指定オプションの整合性チェック(整合性チェックエラー、異常終了)
# ----------------------------------------------------------------------
if [ $objectOption = "-f" ] && [ -d $OBJECT ]; then
echo "オプション, またはコピーするファイル/ディレクトリの指定が誤っています."
showUsage
elif [ $objectOption = "-d" ] && [ -f $OBJECT ]; then
echo "オプション, またはコピーするファイル/ディレクトリの指定が誤っています."
showUsage
# ファイル(or ディレクトリ)指定オプションの整合性チェック(整合性チェッククリア、コピー開始)
# ----------------------------------------------------------------------
# [o] オプション = -f / オブジェクト = ファイルのとき
elif [ $objectOption = "-f" ] && [ -f $OBJECT ]; then
# コピー対象が1台のホスト
if [ $targetOption = "-h" ]; then
echo "以下のファイルをコピーします."
scp -P $sshPortNum $4 $USER@$2:$4
copyErrorCheck
# コピー対象が複数台のホスト
elif [ $1 = "-l" ] && [ $2 = "ipAddressList.txt" ]; then
while read ipAddress; do
echo "以下のファイルをコピーします."
scp -P $sshPortNum $4 $USER@$ipAddress:$4
done < $2
copyErrorCheck
else
echo "オプション, またはコピーするファイル/ディレクトリの指定が誤っています."
fi
# [o] オプション = -d / オブジェクト = ディレクトリのとき
elif [ $objectOption = "-d" ] && [ -d $OBJECT ]; then
# コピー対象が1台のホスト
if [ $targetOption = "-h" ]; then
echo "以下のファイルをコピーします."
scp -P $sshPortNum -r $4 $USER@$2:$4
copyErrorCheck
# コピー対象が複数台のホスト
elif [ $1 = "-l" ] && [ $2 = "ipAddressList.txt" ]; then
while read ipAddress; do
echo "以下のファイルをコピーします."
scp -P $sshPortNum -r $4 $USER@$ipAddress:$4
done < $2
copyErrorCheck
else
echo "オプション, またはコピーするファイル/ディレクトリの指定が誤っています."
fi
# [x] オプションとオブジェクトの整合性が取れていないとき
else
echo "オプション, またはコピーするファイル/ディレクトリの指定が誤っています."
fi
fi
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment