もしかしたら、またどこかで使うかもしれないので記録しておく。
実際に作成したときはRHELだったが、以下はubuntu用で再現。
なので微妙にコマンドパスが違ったりする。
(RHEL : /bin/basename → ubuntu : /usr/bin/basename)
なお、運用管理系の自動実行用シェルだったので、公開鍵認証でssh接続する。
よって、そのための設定を予めしておく必要あり。
また、接続先でsudo実行する場合は、sudo設定(/etc/sudoers)も。
(以下のシェルではsudo実行してる。しない場合はsudoをとる。)
#/bin/sh
set -e
# このシェルの名前
CMDNAME=`/usr/bin/basename $0`
# 引数 $1 接続先(ユーザ名@ホスト)
# 引数 $2 接続先で実行するコマンド(シェル)
# 引数 $3~ コマンドオプション
# 引数2以下の場合はエラー
if [ $# -lt 2 ] ; then
echo "usage: ${CMDNAME} [user@]hostname command [command option]"
exit 255
fi
Dest=$1
Command=$2
Options=
if [ $# -gt 2 ] ; then
for i in `seq 3 $#`
do
tmpval1=`eval echo \$\{$i\}`
Options="${Options} ${tmpval1}"
done
fi
# 実行結果を記述するログ
resultlog="/tmp/${CMDNAME}_${Dest}_${Command}.log"
# 秘密鍵(ここではuserの)
KYL="/home/user/.ssh/id_rsa"
# RET1:接続先での実行結果と戻り値
RET1=`ssh -n -T -i ${KYL} ${Dest} "sudo ${Command} ${Options}; echo return_code=\\$?"`
# RET2:ssh接続の戻り値(ssh通信の正常・異常を判定するために使う)
RET2=$?
# 接続先の実行結果の戻り値を抽出(制御文字を削除し、戻り値だけ抽出)
echo "${RET1}" > ${resultlog}
RET1=`/bin/grep return_code= ${resultlog} | /usr/bin/cut -d = -f2`
RET1=`echo ${RET1} | sed -e 's/[^0-9]//g'`
# 判定
if [ ${RET2} -ne 0 ]; then
echo "${CMDNAME} : ssh connection failed (${Dest})"
exit 1
elif [ "${RET1}" != "0" ]; then
echo "${CMDNAME} : ssh command error at ${Dest} (command:${Command})"
exit 2
fi
echo "${CMDNAME} : Succeed"
exit 0