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のようです.
報告書等
$Id: dsh.html.ja,v 1.34 2008/12/15 14:42:49 dancer Exp $