複数サーバにsshログインする方法

サーバを構築する際にいつも悩むのが、、、同じ構築方法なのになんで何台もオペレーションしないといけないということ。

テンプレートを作ってdump->restoreしてください。と言われればそれまでなのだが、dumpとなるとバージョン管理だったり、イメージ格納ディスクだったりrestore時はそもそもNETWORKにつながらない状態なのでいろいろと大変なのだ。

そんな時のために、sudo対応のexpectでコマンドを発行するスクリプトを作成した。
これをサーバリストでも作ってそのリストとおりにwhileで回せばやりたいことができる。


便利だ。次はログファイルにでも作業内容を落とすとしよう。



#!/bin/sh

SCRIPT=$0

usage(){
cat < -l -c ''
-u execute user name(*)
-l target host
-c execute command(*)
-p password
-h print this help and exit
(*) required
EOF

return 0
}

__check(){

if [ -z "${_USER}" ] || [ -z "${_COMMAND}" ] || [ -z "${_PASSWD}" ]; then
usage
return 1
fi

return 0
}

__getpasswd(){
echo -n "password: "
stty -echo
read _PASSWD
stty echo
echo ""
return 1
}

while getopts f:u:c:ph opt
do
case ${opt} in
'u') _USER=${OPTARG} ;;
'l' ) _HOST=${OPTARG} ;;
'c') _COMMAND=${OPTARG} ;;
'p') __getpasswd ;;
'h') usage && exit 1 ;;
'?') usage && exit 1 ;;
esac
done

__check
if [ $? != 0 ]; then
echo "$SCRIPT is aborted..."
exit 1
fi

expect -c "
set timeout 1
spawn ssh ${_HOST} -l ${_USER}
expect {
\"Are you sure you want to continue connecting (yes/no)?\" {
send \"yes\r\"
expect \"password:\" {
send \"${_PASSWD}\r\"
}
}
\"${_USER}@${_HOST}'s password:\" {
send \"${_PASSWD}\r\"
}
}

expect {
\"$ \" {
send \"${_COMMAND}\r\"
expect {
\"password for ${_USER}:\" {
send \"${_PASSWD}\r\"
}
\"Password:\" {
send \"${_PASSWD}\r\"
}
}
}
}

expect {
\"$ \" {
send \"logout\r\"
}
}
"