RaspberryPi[30] rsycの自動化
Rsync
リモートラズパイのデータをcronで持ってくるのに、scpを使おうかと思っていましたが、ファイルの更新を確認するのなら、rsyc が良いなという事で、rsyc の自動化をしました。
sshpass版
「TTY割り当て」や「プロンプト待ち」みたいな無駄な待機時間がゼロになるから、expect 方式より圧倒的に早い。特に rsync は最初の認証が終わるまでデータ転送を始められないから、expect でタイミングがずれるだけでも 1〜2秒のロスが出るんだけど、sshpass だと直接 stdin にパスワードを渡すから一瞬で通る。こちらがおすすめ。
#!/bin/bash
# backup-ytl-xing-obc-103.sh
# /home/pi/DATA/XING/ → さくらVPS:/home/ntsel/XING/OBC-103 に同期
set -euo pipefail
PASSWORD="********"
REMOTE_USER="****"
REMOTE_HOST=*.*.*.jp"
REMOTE_PATH="/home/***/***"
LOCAL_PATH="/home/pi/***/***"
# SSHオプション(初回接続で止まらないように)
SSH_OPTS='-o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/home/pi/.ssh/known_hosts'
echo "【開始】$(date '+%Y-%m-%d %H:%M:%S')  ${LOCAL_PATH} → ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"
# ディレクトリ作成も含めて rsync(差分・更新のみ・圧縮)
sshpass -p "${PASSWORD}" \
rsync -auz \
  --rsync-path="mkdir -p ${REMOTE_PATH} && rsync" \
  -e "ssh ${SSH_OPTS}" \
  "${LOCAL_PATH}/" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"
echo "【完了】$(date '+%Y-%m-%d %H:%M:%S')"
sshpass 版
下に示す expect を使用していましたが、パスワード送信のタイミングが微妙に変わりうまくいかない場合、または個体があることがわかりました。そこで、sshpass を使用することに変更しました。
expect版
自動化をするのに、expect というコマンド(実はスクリプトらしい)をインストールする必要があります。
 sudo apt install expectシェルスクリプトはこんな感じです。全角スペースが入っているとエラーになります。
#!/bin/sh
PASSWORD="相手先のパスワード"
expect -c "
spawn rsync -auz -e ssh /home/xx/ 相手先のログイン名@相手先のIPアドレス:/home/コピー先
expect \"パスワード要求時に表示される文字列\"
sleep 1
send \"$PASSWORD\n\"
expect eof
exit 0
"
「パスワード要求時に表示される文字列」は実際に rsyncを手で打って帰ってくる文字列です。大体こんな感じだと思います。
user@IP address's password:cron はこんな感じ
cron -e でエディット、cron -l で確認です。まあ、これは説明もいらないですよね。
0 11 * * * /home/xx/yy/backup.sh

