2013年3月6日水曜日

ssh接続してコマンド実行するシェル

sshで接続先サーバでコマンド実行して、コマンドエラーをこちらのサーバ(接続元サーバ)で処理したかったときに作ったシェル。
もしかしたら、またどこかで使うかもしれないので記録しておく。
実際に作成したときは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

2013年3月5日火曜日

Rのインストール(Ubuntu)

今さらながら、Rを自宅マシン(Ubuntu 12.04)にインストールした。
そのときのメモ。
ちなみに、以下のページを参考にした。
Rのインストール

1.sources.listにパッケージを取得するサイトを追加
$ sudo gedit /etc/apt/sources.list
以下をsources.listに加える。
deb http://cran.ma.imperial.ac.uk/bin/linux/ubuntu precise/
他のサイトを追加したい場合は、CRAN Mirrors

2.Ubuntu レポジトリの公開鍵を入手
以下を実行。
$ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
$ gpg -a --export E084DAB9 | sudo apt-key add -

3.最新のパッケージリストを取得
以下を実行。
$ sudo apt-get update
以下のようなメッセージが出てうまくかなかった場合は、1で追加したサイトを変更する。
W: http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/gutsy/Packages の取得に失敗しました 404 Not Found
W: http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/feisty/Packages の取得に失敗しました 404 Not Found
W: http://cran.md.tsukuba.ac.jp/bin/linux/ubuntu/dapper/Packages の取得に失敗しました 404 Not Found

4.Rのインストール
以下を実行。
$ sudo apt-get install r-base

5.Rの実行
$ R
で実行すると、
R version 2.15.3 (2013-03-01) -- "Security Blanket"
Copyright (C) 2013 The R Foundation for Statistical Computing
ISBN 3-900051-07-0
Platform: i686-pc-linux-gnu (32-bit)

Rは、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()'あるいは'licence()'と入力してください。

Rは多くの貢献者による共同プロジェクトです。
詳しくは'contributors()'と入力してください。
また、RやRのパッケージを出版物で引用する際の形式については
'citation()'と入力してください。

'demo()'と入力すればデモをみることができます。
'help()'とすればオンラインヘルプが出ます。
'help.start()'でHTMLブラウザによるヘルプがみられます。
'q()'と入力すればRを終了します。

>
上記のようなメッセージが出てRを実行できる。

6.パッケージのインストール
以下を実行し、CRANミラーサイトを選択する。
(以下を実行しなくても、install.packagesを実行すると最初に選択することになる。)
chooseCRANmirror()
以下を実行してパッケージをインストール(以下はkernlabをインストールする例)。
install.packages("kernlab")