DSH - dancer's shell / distributed shell

dshとは

dshは,リモートシェル(rsh/remsh/ssh)を複数同時に実行するためのラッパープログラムです. rsh/remsh/sshはシェル(ksh/bash/zsh/tcsh/sh等)をリモートホストで実行するためのプログラムです.

セキュリティーホールについて

Bugtraqに2003年8月10日に流れたSecurity advisory アドバイザリのページ はLinux等の asprintf を提供しているシステムには影響しません. つまりglibcを使っている Debian や ほとんどのLinuxは脆弱ではありません.

また,dshの提供するasprintf の実装を確認したところ,vsnprintf で バッファ長を指定しているため,脆弱ではないです. クラッシュさせることはできませんでした. "make check"でセキュリティーホールが存在するかどうかを確認できるようになっています (test-bufferoverflow.sh). HP-UXは脆弱でない事は確認しました. 2003年8月26日 0.24.2

目的

UNIX クラスタシステムなどにおいて、多数のシステムを管理 するときに、同じコマンドを複数のシステムで実行する必要があるとき が多々ある。 そのためのスクリプトを書くことは、多くのシステム管理者が行うこと である。 しかしながら、毎回そういうスクリプトを書く事は好ましくなく面倒で ある。 そこで、Debianシステムを複数管理している作者は、 一般に普及している汎用のスクリプトをさがしたが、満足に動くものが 少かった。 そこで、自分で利用しているプログラムをより汎用にし、 公開しておき、自分が出先でシステムをインストールするときに 自分のつかいなれている、信頼できるプログラムが世界中にある ミラーから取得できるようにしたかった。

現実

問題を解決するのに必要なだけの単純なプログラムを作成した. いろいろな技を駆使してより高速な分散実行ができるように なっているシステムを考えた. 階層的な実行を実装し, まず4台にrshでアクセスし,その4台から16台にrshでアクセスするという 手法を取れるようにした. 設定ファイルは、テキストベースで、 マシンのリストを書けば、 それらに対し、rshやsshを利用してプログラムを実行するシステムが 構築された。

また,並列度を制限した実行もサポートする. ある時点では一定の接続しかしないという制限を持たせる. dsh -c はLinuxのデフォルト設定でのリソースを200ホスト程度で くいつぶしてしまう. dsh -F 200 等と指定するとよりシステムに親切な実行ができる.

結果

複数のクラスタにインストールして, 快適にプログラムが実行できる環境をつくった。 現在、dmachinemonシステムが、dshを利用しています。 このバージョンのdshはCで書かれています.

ダウンロード

ファイル置場に,dshのソースは おいてあります. バイナリは,Debian等から取得してください.

NIS等により提供されるnetgroup情報に対応しています.

dshの最近のバージョンではlibdshconfigというライブラリを 要求します,別パッケージになっているので, それもとってきてください.

コンパイル方法

Debianを利用している方以外のために, コンパイルの方法を説明します. まず,libdshconfigをコンパイル,インストールします.

      $ tar xfz libdshconfig*.tar.gz; 
      $ cd libdshconfig-*
      $ ./configure ; make
      # make install
    

そのうえで,dshをコンパイルインストールします.

      $ tar xfz dsh*.tar.gz
      $ cd dsh-*
      $ ./configure ; make 
      # make install
    

現在Linuxシステム以外にもAIX 4, Solaris, Cygwin, MacOSX, HP-UX 11.22, Tru64 UNIX(テストは通らない) でコンパイルできることを確認しています.

設定

/etc/dsh/machines.listもしくは,自分でコンパイルした場合は ${sysconfdir}/machines.listにマシンの一覧として利用するデータがあります. ここにマシンの一覧を記入してください.

${HOME}/.dsh/group/group-nameにグループ名に対応するファイルを置くと, そのファイルに書いてあるホスト一覧に対してグループでコマンドを実行できるようになります.

利用

dsh -a -c -- uname -aとすると、全てのノードに対し、 プログラムを実行することができます。

dsh -g children -c -- uname -a とすると ${HOME}/.dsh/group/childrenにより定義された グループ「children」に対してコマンドを実行します.

また,dsh -g @netgroupname -- uname などとすると, netgroupに対してプログラムを実行することができます.

詳しくはdsh.1を読んでください.

同志社大学 知的システムデザイン研究室の谷口氏が書いた説明書は わかりやすい説明でしょう.

関連したもの

コードを参考にしたわけでもないのですが,同じようなものが多数この世の中にはあるようです. メンテナンスのされかたや移植性はまちまちです.

いろいろなシステムが模倣しているのは基本的にはAIXのdshのようです.

参考文献

報告書等


Junichi Uekawa

$Id: dsh.html.ja,v 1.34 2008/12/15 14:42:49 dancer Exp $