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