scpコマンドをcronjobで定時実行させる
※「シス環系女子 season2 第3話」の備忘録です。
公開鍵1つに実行可能なコマンド列1つだけ設定しておけば、万が一秘密鍵が流出しても実行できるコマンドは設定したコマンド1つだけなので安心できる。
そのやり方の記事。
以下記事よりssh接続可能なコンテナ2つを前もって準備しておくこと。
https://qiita.com/neo_fukafukafukka/items/34ece05e14547d847450
crontabによる自動scpが失敗するケース
以下のscpコマンドを、手動で実行するだけなら成功する。
# scp -P 2222 root@172.17.0.2:/root/master_file.txt ./
master_file.txt 100% 15 2.3KB/s 00:00
※便宜上、上記コマンドを以下のようにシェルスクリプトにまとめておく。
#!/bin/bash
scp -P 2222 root@172.17.0.2:/root/master_file.txt ./
以下のようなソースで定時に自動でscp実行させようとすると失敗するケースがある。
// ※crontabs入れてなかったので入れる。
# yum -y install crontabs
# crontab -l
MAILTO=""
*/2 * * * * /bin/bash get_master_file.sh
// cronを起動する
# systemctl start crond
// 秘密鍵にパスフレーズがある場合は、いつまで経ってもmasterコンテナのファイル(master_file.txt)が取得できない。(crontabが失敗してる。)
- 対策
秘密鍵にパスフレーズを入力せず、公開鍵にコマンド列1つを関連づける。
※コマンド列は1つしか関連付けられない。
公開鍵にコマンド列1つを関連づける
slaveコンテナ内で公開鍵を新しく生成・コピーする。
# mkdir .ssh/for_get_master_file
# cd .ssh/for_get_master_file/
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/for_get_master_file/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/for_get_master_file/id_rsa.
Your public key has been saved in /root/.ssh/for_get_master_file/id_rsa.pub.
The key fingerprint is:
// 省略
# vi id_rsa.pub
// 公開鍵をコピー
上記でコピーした公開鍵を、masterコンテナ内のauthorized_keysに追加する。
# vi authorized_keys
// slave側の公開鍵を既存の公開鍵の下にペーストする
// 以下のように「echo hoge」だけ使えるように設定してみる。
ssh-rsa AAAAB3Nza~~~省略~~~14G06GK7 root@6b3305967d37
command="echo hoge" ssh-rsa AAAAB3Nza~~~省略~~~4BgA/iOol root@6b3305967d37
すると以下のようにslaveコンテナ側ではcrontabがいつまで経っても成功しない。(master_file.txtが取得できない。)
# ls
anaconda-ks.cfg get_master_file.sh
次にslaveコンテナ側の公開鍵に対応するコマンドを以下のように修正してみる。
# vi authorized_keys
// slave側の公開鍵をペーストする
// 以下のように「/bin/bash get_master_file.sh」の処理の中身(scpコマンド)を使えるように設定してみる。
ssh-rsa AAAAB3Nza~~~省略~~~14G06GK7 root@6b3305967d37
command="scp -f /root/master_file.txt" ssh-rsa AAAAB3Nza~~~省略~~~4BgA/iOol root@6b3305967d37
すると以下のようにslaveコンテナ内で、masterコンテナのmaster_file.txtが取得できていることが確認できる。(crontabが実行できた。)
# ls
anaconda-ks.cfg get_master_file.sh master_file.txt
なぜ公開鍵へ関連付けたコマンドが「scp -f /root/.ssh/master_file.txt」なのか?
master側で実行されているscpコマンドの実態が「scp -f /root/.ssh/master_file.txt」だから。
slaveコンテナからmasterコンテナに対してscp実行した時、実はmaster側でもscpが実行されていて、それが上記のコマンド。
設定するのはあくまでサーバー側で実行されるコマンドであることに注意。(「scp -P 2222 root@172.17.0.2:/root/master_file.txt ./」を設定するのではないことに注意。)