column

Kompiraジョブフローの基礎 Kompiraのセッション機能を利用して対話的にコマンドを実行する

Kompiraでサーバー等でコマンドを実行する際には[“コマンド”]というように[ ]で囲みます。この場合、複数の[ ]内のコマンドは別のセッションとして実行されます。例えば次の様なジョブフローを見てみましょう。

この実行結果は例えば次の様になります。

dateコマンドの出力がロケールを明示的にCロケールに変更した2行目だけ英語になっているのがお分かりになると思います。また2行目で設定したロケールが3行目のdateコマンドを実行する際に引き継がれておらず、改めて日本語出力になっています。つまり各行がそれぞれ別のセッションとして実行されています。
コマンドの実行の都合上、同一セッションで行わなければならない局面では、sessionブロックを利用して記述します。

 
sessionブロック

sessionブロックは以下のような形式で記述します。

[“コマンド”]の場合の実行結果は$RESULT変数に格納されますが、セッションの途中の状態では接続先のリモートサーバーとのやり取りをセッションチャネルを通じて行います。またセッションブロック終了時、$RESULTにはセッションチャネルが格納され、date属性に未読み込みのデータが格納された状態になります。またセッションが成功した場合にはセッションブロック終了後に$STATUSに0が格納されます。

たとえば、上記と同じように実行するには次の様になります。

この場合の実験結果は、例えば次の様になります。

[“コマンド”]の場合とは異なり、ジョブフロー中の2回目のdateコマンドの直前に設定されたLANGが3回目のdateコマンドの実行時にも有効になっているのが見て取れると思います。

 

接続先サーバーとの対話

コマンドを実行した結果に応じてコマンドを投入したい場合は、セッションチャネルでガード式を利用して指定した応答を待ちます。上記の例ではセッションの値を拾う際に<s>としていますが、ここを <s ?? g”*]$ “> のように書きます。この場合、メッセージキューの先頭から順にオブジェクトがマッチするかどうかを調べ、マッチした場合には、それまでのオブジェクトを破棄して、マッチしたオブジェクトを受信します。
ここでは

のようなシェルログインした場合のプロンプトが返ってくるのを待ちます。応答が指定のパターンにマッチした場合に次の処理に進みます。

の部分は、globのパターンリテラルを使用しており、”(任意文字列)]$ “で上記のプロンプトにマッチさせるようにしています。

ジョブフローにすると、例えば以下のようになります。

実行結果は次の様になります。

上記の例では通常のシェルログインをした際のプロンプトを想定したマッチングパターンを利用していますが、例えばsuコマンドでパスワード待ちを行わせるような場合には、

のようにして、パスワード入力のプロンプトを待って、パスワード文字列を入力をさせる事が出来ます。