複数サーバにsshログインする方法
サーバを構築する際にいつも悩むのが、、、同じ構築方法なのになんで何台もオペレーションしないといけないということ。
テンプレートを作ってdump->restoreしてください。と言われればそれまでなのだが、dumpとなるとバージョン管理だったり、イメージ格納ディスクだったりrestore時はそもそもNETWORKにつながらない状態なのでいろいろと大変なのだ。
そんな時のために、sudo対応のexpectでコマンドを発行するスクリプトを作成した。
これをサーバリストでも作ってそのリストとおりにwhileで回せばやりたいことができる。
便利だ。次はログファイルにでも作業内容を落とすとしよう。
#!/bin/shSCRIPT=$0
usage(){
cat <-l -c ' '
-uexecute user name(*)
-ltarget host
-cexecute command(*)
-ppassword
-h print this help and exit
(*) required
EOFreturn 0
}__check(){
if [ -z "${_USER}" ] || [ -z "${_COMMAND}" ] || [ -z "${_PASSWD}" ]; then
usage
return 1
fireturn 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
fiexpect -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\"
}
}
"