コマンド実行後に何も表示されないことを判断する方法
回答済みお世話になっております。
sshで接続したサーバ上で、
コマンド実行後に何も表示されないことを判断するジョブフローを作成しています。
|timeout = 2|
[node = xxxxx] ->
[prompt = "*xxxx*"] ->
[result_len = 0] ->
[__node__= node] ->
[__use_pty__ = true] ->
[command_array =[
# ["[0]ステップ名","[1]実行コマンド","[2]確認用コマンド"","[3]正常判定式","[4]説明"]
["step3-1","","hostname | grep dadadadad","null","テスト"],
["step3-2","","echo test","null","テスト"],
["step3-3","","hostname","null","テスト"],
["step3-4","","ls test","null","テスト"]
]] ->
{ session s |
<s ?? g'$prompt'> ->
{ for command in command_array |
print("===================================") ->
print(command[0]+":"+command[4]) ->
[s.send:command[2] + '\n'] -> # コマンドを実行
sleep(timeout) -> #待ち時間
<s ?? g'$prompt'> ->
{ while $RESULT != null| # $RESULTの中身が空になるまで)
[result_len = result_len + 1] ->
<s: timeout> =>
{if $STATUS | break }# タイムアウトしたらループを抜ける
} ->
{if result_len == 1 |
then:
print("コマンド実行後に何もされず、プロンプトがかえってくるため正常") ->
print(result_len) ->
[result_len = 0] #カウントをリセット
else:
print("コマンド実行後に何かしら表示されたため異常") ->
print(result_len) ->
abort("result_lenの値が1以外のため、異常終了します")
}
}
}
実行結果は以下のようになります。
===================================
step3-1:テスト
[xxx.xxx.xxx.xxx] session: [user@host ~]$ hostname | grep abcdefg
コマンド実行後に何もされず、プロンプトがかえってくるため正常
1
===================================
step3-2:テスト
[xxx.xxx.xxx.xxx] session: [user@host ~]$ echo test
[xxx.xxx.xxx.xxx] session: test
コマンド実行後に何もされず、プロンプトがかえってくるため正常
1
===================================
step3-3:テスト
[xxx.xxx.xxx.xxx] session: [user@host ~]$ hostname
[xxx.xxx.xxx.xxx] session: xxxxxx
コマンド実行後に何かしら表示されたため異常
2
aborted at line 37 in xxxxxxxxxxxxxxx: result_lenの値が1以外のため、異常終了します
step3-1はコマンド実行後に何も表示されないため、想定通りに正常終了しています。
想定ではstep3-2で異常終了でさせたいのですが、なぜか正常と判断されてしまいます。
step3-3は、想定通りに異常終了します。
echoコマンドとhostnameコマンドで$RESULTの内容に差がでるのでしょうか。
また、他にコマンド実行後に何も表示されないことを確認する方法があれば
ご教授いただけないでしょうか。
よろしくお願いいたします。
---------------------------------------------
使用バージョン:1.6.2.post7
ssh接続先のOS:CentOS Linux release 7.9.2009
-
正式なコメント
フィックスポイントの高橋です。
セッションブロック内において、以下のイベントジョブでプロンプトを待ち受けされています。
<s ?? g'$prompt'>
これは、セッションで得られた出力を先頭から見ていきプロンプトに合致するものがあれば、それ以前の出力を破棄して合致した値を返す動きとなります。よって、step3-2 で "echo test" による出力があるにも関わらず、それを捨てて、その後に表示されたプロンプトを拾って、上記のイベントジョブの結果となります。(むしろ「step3-3は、想定通りに異常終了します」のほうが、何かおかしいような気がしますが、いただいた結果だけでは判断がつきません。手元環境では step3-3 も正常になります)
プロンプトまでの出力を保存しておき判断する、という方法が有効かもしれません。たとえば、コマンドを送信している部分から while $RESULT で出力を待ち受けているループの部分を、以下のようにしてみてはいかがでしょうか。
[results = []] ->
[s.send:command[2] + '\n'] -> # コマンドを実行
{ while true |
<s: timeout> =>
{if $STATUS |
break # タイムアウトしたらループを抜ける
} ->
[results.add_item: $RESULT] ->
{ if $RESULT =~ g'$prompt' |
break #プロンプトを見つけたらループを抜ける
}
} ->セッションの待ち受けがタイムアウトした場合はループを抜けます。出力をえられた場合は配列 results に追加していき、それがプロンプトにマッチする場合はループを抜けます。
このようにすると、コマンドによる出力とマッチしたプロンプトが配列 results に格納されるはずです。
出力がプロンプトだけであるかは、簡単には以下のように配列 results の要素数で判定できるかもしれません。
{if length(results) == 1 |
:
print(results)ただし、このジョブフローでは __ust_pty__ = true としていて、PTY モードでサーバにアクセスしています。このときは送信したコマンドのエコーバック表示もセッションで受信することになるので、コマンドが何も出力しなくても、results には送信したコマンド行とプロンプト行の2要素が格納されているかもしれません(手元ではそのようになりました)。
この方式を持ちいる場合は、コマンドのエコーバックとプロンプトの扱いについては工夫が必要になるかもしれません。
よろしければ、上記参考にしていただいて、よりテストしたい内容になるようにジョブフローを調整してみてください。
コメントアクション
サインインしてコメントを残してください。
コメント
2件のコメント