パスワード認証でSSH接続する設定のサーバー間で定期的にファイルのバックアップを行うことがあったのでメモ
秘密鍵認証であれば一度通信してしまえば煩わしいパスワードの入力も不要なのでscpの実行内容を書いたシェルスクリプトなんかをを cron で実行するようにすればすみます。
が、パスワード認証の場合は接続のたびにパスワードを入力する必要があるため、cron で実行できない・・
それができるんですね!
今回はその方法をご紹介します。
Step1 expectをインストールする
expect
を使用することで対話的なコマンドも自動化することが可能です。
なのでこれを使っていきます。
RHEL 系の OS にはデフォルトでパッケージがインストールされていないのでインストールします。
yum -y install expect
はい、これでおk
Step2 SCPでファイルを持ってくるシェルスクリプト
下記のスクリプトを cron で実行することで指定した時間にファイルを取ってきてくれるようになります。
#!/bin/bash
#HOST=対象ホスト名
#USER=ログインユーザ
#PASS=パスワード
#TARGET_DIR=バックアップディレクトリ(ファイル)
#BACKUP_DIR=保存先ディレクトリ
HOST=hogehoge.jp
USER=piyo
PASS=password
TARGET_DIR=/home/user
BACKUP_DIR=/bk/dir
expect -c "
set timeout 60
spawn scp ${USER}@${HOST}:${TARGET_DIR} ${BACKUP_DIR}
expect {
" Are you sure you want to continue connecting (yes/no)? " {
send "yesr"
expect "password:"
send "${PASS}r"
} "password:" {
send "${PASS}r"
}
}
interact
"
簡単に処理の内容を説明します。
expect -c " # expect コマンドを実行 -cオプションはダブルクォートでくくった複数行を自動対話処理する
set timeout 60
spawn scp ${USER}@${HOST}:${TARGET_DIR} ${BACKUP_DIR} # expect コマンドの管理下でscpを実行する
expect { #相手側からメッセージを受信
" Are you sure you want to continue connecting (yes/no)? " {
send "yesr" #相手側へメッセージを送る
expect "password:"
send "${PASS}r"
} "password:" {
send "${PASS}r"
}
}
interact #対話を終了する
"
文法まとめ
expect -c:ダブルクォートで囲った複数行を自動対話処理する
spawn + コマンド:コマンドを実行する
expect:対話の受信
send:対話の送信
send ***"r":改行コードを送る
interact:対話の終了
注意点
このスクリプトは同じネットワーク内のサーバー間でファイルをやりとりする際のみ使いましょう。
パスワードとか平文で流れちゃうしね。
インターネット越しで使うのダメ・ゼッタイ。