インフラエンジニアbacchiのわかったことまとめ

bacchi.me

Linux

【Linux】パスワード認証のSPCをcronで実行する方法

更新日:

パスワード認証でSSH接続する設定のサーバー間で定期的にファイルのバックアップを行うことがあったのでメモ

秘密鍵認証であれば一度通信してしまえば煩わしいパスワードの入力も不要なので
scpの実行内容を書いた.shファイルをcronで実行するようにすればすみますが
パスワード認証の場合は接続のたびにパスワードを入力する必要があるため、cronで実行できない・・
baki
それができるんですね!

今回はその方法をご紹介します。

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:対話の終了

注意点

このスクリプトは同じLAN内のサーバー間でファイルをやりとりする際のみ使いましょう。

パスワードとか平文で流れちゃうしね。
WANで使うのダメ・ゼッタイ。

Sponsor Link

スポンサーリンク

Sponsor Link

スポンサーリンク

-Linux
-

Copyright© bacchi.me , 2020 AllRights Reserved.