概要
sftpでファイル転送するスクリプトを展開したら、動かないと言われた
ログには Host key verification failed. としか出ていない
原因は以下だった
sftpコマンドをバッチモードで実行し、かつ対象サーバがknown_hostsに含まれていない時は、 Are you sure you want to continue connecting (yes/no/[fingerprint])?
のメッセージが出ることなく認証失敗となってしまう
対策
「実行前に、サーバへ一旦接続してknown_hostsに入れておいてください」で済めばいいのですが、今回はそれでは難しかったので、スクリプトの引数によってテストモード実行ができるようにしました。
コード
引数によってテストモードに振り分ける部分
スクリプト冒頭部
# パラメータ取得
while getopts tl: OPT
do
case $OPT in
"t" ) IS_TEST_MODE="TRUE" ;;
esac
done
# -tパラメタ 他のパラメタを無視して接続テストをする
if [[ "$IS_TEST_MODE" = 'TRUE' ]]; then
communicationTestMain
exit
fi
接続テスト部分
テストという体ですが、やりたいことはknown_hostsへの追加です。
接続テスト実施部分
# -------------------------
# 接続テスト全体
# -------------------------
communicationTestMain() {
cmd_sftp_server1='sftp -v -oPort=22 -i /home/user/.ssh/id_rsa user@192.168.0.21'
cmd_sftp_server2='sftp -v -oPort=22 -i /home/user/.ssh/id_rsa user@192.168.0.22'
echo "--------------------------------------------"
communicationTestOne "$cmd_sftp_server1" 'サーバー1'
echo "--------------------------------------------"
communicationTestOne "$cmd_sftp_server2" 'サーバー2'
echo "--------------------------------------------"
echo "接続テスト完了です。すべて接続成功であれば後続作業を行えます。"
echo "成功しなかった環境がある場合、後続作業は行えません。個別に調査してください。"
echo "--------------------------------------------"
}
# -------------------------
# 接続テスト個別
# $1=接続コマンド
# $2=サーバ名
# -------------------------
communicationTestOne() {
echo "$2サーバへの接続テストを行います。"
echo "接続するかどうかというメッセージが出たら、yesあるいはその旨の選択肢で答えてください。"
echo "「sftp> 」が出たら接続成功です。exitと入力して、sftpを終了してください。"
echo "「sftp> 」が出ない場合は失敗です。"
read -p "上記を確認して準備ができたら、enterを押してください。"
eval $1
read -p "$2サーバへの接続テスト完了です。成功か失敗かを確認したら、enterを押してください。"
}