そこで,定期的にファイルの転送をサーバに行わせるために,ファイルの転送を自動的に行うShellScriptを作成する.
内部でFTPクライアントを使用しているため,事前にFTPクライアントをインストール
#yum install ftp
また,ファイルの送信先サーバがFTPサーバとしてもどう際してる必要がある為,ローカルで動作確認を行う為には,FTPサーバをインストールする必要がある.
#yum install vsftpd
#service vsftpd start
#chkconfig vsftpd on
転送試験に使用するファイル用意
$vi ~/script/test.txt
転送試験の際の受信用ディレクトリ用意
$mkdir ~/script/receive
ftp_put.bash
#!/bin/bash ################################################ # 設定 ################################################ # 送信するファイル L_FILE="/home/(ユーザー名)/script/test.txt" # 送信先ホスト R_HOST="localhost" # 送信先ディレクトリ R_DIR="/home/(ユーザー名)/script/receive" ################################################ # 関数 ################################################ # ファイルを FTP で送信する # 入力 # $1: 送信するファイル名 # $2: 送信先ホスト名 # $3: 送信先ディレクトリ # $4: 一時作業ディレクトリ # 終了ステータス # 0: 成功 # 1: 失敗 ftp_put_file () { local l_file="$1" local r_host="$2" local r_dir="$3" local tmpdir="$4" local filename="${l_file##*/}" local r_file="${r_dir}/${filename}" local log="${tmpdir}/ftp_put.log" local status # FTP を実行 ftp -v -g "${r_host}" <<-EOF > "${log}" 2>&1 quote NOOP put "${l_file}" "${r_file}" quote NOOP EOF # 結果チェック(1) status=$? if [ "${status}" -ne 0 ]; then return "${status}" fi # 結果チェック(2) ftp_chk_transfer "${log}" # 失敗した場合にはエラーメッセージ(かもしれないもの) # の最後の3行を標準エラー出力に表示 if [ $? -ne 0 ]; then grep -v '^[123][0-9][0-9]' "${log}" | tail -3 1>&2 return 1 fi return 0 } # FTP によるファイル送受信を、ログからチェックする # 入力 # $1: 転送ログ # 終了ステータス # 0: 転送成功 # 1: 転送失敗 ftp_chk_transfer () { local state="START" local code local msg_first local msg_rest # ログファイルを読みながらのループ while read code msg_first msg_rest; do case "${state}" in # 最初の NOOP 実行前 START) if [ "${code} ${msg_first}" == "200 NOOP" ]; then state=TRANS_START fi ;; # PASV/PORT でのコネクション確立中 TRANS_START) case "${code}" in 125 | 150) state=TRANS_DATA ;; 200) if [ "${msg_first}" == NOOP ]; then # 想定外 state="ERROR" break fi ;; esac ;; # データ転送中 TRANS_DATA) case "${code}" in 226 | 250) # 転送成功 state=SUCCESS break ;; 200) if [ "${msg_first}" == NOOP ]; then # 想定外 state="ERROR" break fi ;; esac ;; esac done < "$1" # 以下の test の結果が関数の終了ステータス [ "${state}" == "SUCCESS" ] return } ################################################ # メイン処理 ################################################ # util_common.bash を読み込む(make_tmp_dir/clean_tmp_dir) FILE_UTIL=util_common.bash . "${FILE_UTIL}" 2> /dev/null \ || . "${0%/*}/${FILE_UTIL}" 2> /dev/null if [ $? -ne 0 ]; then echo "Can't load ${FILE_UTIL}!" 1>&2 exit 1 fi # 作業ディレクトリの作成 tmpdir=$(make_tmp_dir 2>/dev/null) if [ $? -ne 0 ]; then echo "Can't create temporary directory!" 1>&2 exit 2 fi # trap の設定 SIGNALS="HUP INT QUIT PIPE TERM" trap "{ clean_tmp_dir; exit; }" ${SIGNALS} ftp_put_file \ "${L_FILE}" \ "${R_HOST}" \ "${R_DIR}" \ "${tmpdir}" status=$? # 作業ディレクトリの削除と trap 解除 clean_tmp_dir trap ${SIGNALS} # スクリプトの終了ステータスを # ftp_put_file の終了ステータスに exit ${status}
.netrc(設定ファイル)
machine localhost login <ユーザー名> password <パスワード>
0 件のコメント:
コメントを投稿