ttlで戻り値を取得する方法

このQ&Aのポイント
  • Teratermmacroを使用して、ローカルからリモートサーバに接続し、コマンドの戻り値を取得したいです。
  • if文の条件式を変えることで戻り値を判別しましたが、必ず0または1の値が返されてしまいます。
  • シェルスクリプトをリモートサーバに配置することはできません。
回答を見る
  • ベストアンサー

ttlで戻り値を取得する方法

Teratermmacroでローカル(cygwin)に入り、サーバ(HP-UX)にリモートで入った後、 コマンドの戻り値で後の行動を操作したいのですが、うまくいきません。 わかる方、教えていただけませんか。 ざっくり以下のようなマクロを組んでいます。 ---------------------------------------------------------- sendln 'ssh name@host1' wait Prompt sendln 'sendmsg "test"'(のようなコマンド) ←これの戻り値がほしい if 戻り値 = 0 then  ○○ elseif 戻り値 = 1 then  wait Prompt  sendln 'exit'  wait Prompt  sendln 'ssh name2@host2' 以下略 ---------------------------------------------------------- 上記の「戻り値」をどのようにすれば戻り値で判別してくれるでしょうか。 if文の条件式を $?やresultでやりましたが、どのような戻り値でも 必ず$?は0、resultは1で固定でした。 また、sendmsgとif文の間に以下のように試しましたが、失敗しました。 例1: ---------------------------------------------------------- sendln 'echo $?' recvln if inputstr = 0 then ←syntax errorになります。  ○○ elseif inputstr = 1 then ---------------------------------------------------------- 例2:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1247390747参照 ---------------------------------------------------------- sendln 'echo $?' recvln recvln hensu=inputstr ←Type mismatch.のエラーになる。 直前にstr2intを入れたりしても駄目でした。 ちなみにsendln 'echo $?'を挟まずsendmsgの直後にrecvlnでも駄目です。 if hensu = 0 then  ○○ elseif hensu = 1 then ---------------------------------------------------------- host1にシェルスクリプトを入れることは出来ません。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

基本方針は、echo $? の出力文字をttlで受信して判定、でいいと思います。 ・inputstrは文字列なので、=での比較はできません strcompareコマンドで比較→変数resultで判定 あるいは str2int 変数 intputstr で変数に数値化→if 変数=0 等と判定 ということになります。 http://ttssh2.sourceforge.jp/manual/ja/macro/syntax/variables.html http://ttssh2.sourceforge.jp/manual/ja/macro/command/strcompare.html http://ttssh2.sourceforge.jp/manual/ja/macro/command/str2int.html ・recvln1つではエコーバックの分を受け取ってしまうようです。 他の出力を受信してしまう場合もあります。 確実にやるなら、目印を付けてwaitでそこまで待つ、というのがいい思います sendln 'echo "=== EXIT STATUS === : $?"' wait '=== EXIT STATUS === : ' recvln ・シェルスクリプトを入れることはできなくても、複合コマンドを実行することはできるはずです。 sendln '(sendmsg "test" && echo "==== OK ====") || echo "==== NG ===="' waitlnで待ち→resultで分岐とできます http://ttssh2.sourceforge.jp/manual/ja/macro/command/waitln.html

nan_dato_
質問者

お礼

頂いた内容を合わせて出来ました。ちゃんとResult2とでました。ありがとうございます! sendln 'tail bbb && echo "==OK==" || echo "==NG=="' wait '==' recvln recvln waitln '==OK==' '==NG==' if result = 0 then messagebox inputstr "Result" elseif result = 1 then messagebox inputstr "Result1" elseif result = 2 then messagebox inputstr "Result2" endif

nan_dato_
質問者

補足

以下で試しましたが、bbbが存在しなく、echoの結果がNGとでたのに、Result1と表示されました。 sendln 'tail bbb && echo "==OK==" || echo "==NG=="' waitln '==OK==' '==NG==' if result = 0 then messagebox inputstr "Result" elseif result = 1 then messagebox inputstr "Result1" elseif result = 2 then messagebox inputstr "Result2" endif

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

ちょいと試してみました。 # 接続先はCentOS 6.4のbashです。 ---------------------------------------------------------- setsync 1 sendln 'echo $?' recvln recvln if result = 1 then messagebox inputstr "Result" endif ---------------------------------------------------------- で、falseコマンド実行後は1が、trueコマンド実行後は0が表示されました。 動機モードになっていなかったため、recvlnを実行したときには受信処理が終わっていたのではないでしょうか?

nan_dato_
質問者

補足

条件分岐に0、1をそれぞれ入れて試しましたが、echo の結果が0なのに、if result = 0 thenではなく、if result = 1 thenの分岐に進みました。recvlnの結果がresultに格納されてません。

関連するQ&A

  • Teratemマクロ(ttl)のwaitについて

    お世話になります。 下記のようにマクロを記述して、コマンドの戻り値で判定を行い 異常時にダイアログを表示させようとしています。 sendln '<コマンド>' wait 'root@' sendln 'echo "=== STATUS $? ==="' wait 'root@' recvln recvln strcompare inputstr '=== STATUS 0 ===' if result!=0 messagebox 'Error' param1 end こちらを実行すると、<コマンド>の内容に依って下記悪い実行例のように <コマンド>のあとのwaitが効かず、<コマンド>が終わる前にechoが実行されたような 動きをしており正しく動作しない場合があります。 ☆悪い実行例 [root@ ~]# <コマンド> echo "=== STATUS $? === [root@ ~]# echo "=== STATUS $? === === STATUS $1 === [root@ ~] ☆良い実行例 [root@ ~]# <コマンド> [root@ ~]# echo "=== STATUS $? === === STATUS $1 === [root@ ~] 常に良い実行例のように、<コマンド>が終わってからechoするようにしたいのですが どのように修正すればいいでしょうか? なお、timeoutについてはマクロ中で設定していないのでタイムアウトしない認識でおります。 また、悪い実行例のパターンで下記のようにしてwaitの戻り値を拾ったところ1となっていました。 sendln '<コマンド>' wait 'root@' messagebox result param1 sendln 'echo "=== STATUS $? ==="' 以下、試して駄目だったことです。 ・同期モードの使用 setsync=1、およびtimeout=60をマクロの前半部分に記載。 特に変化はなし。 ・<コマンド>のあとのwaitを2つ重ねる <コマンド>の内容によって、うまく言ったようにみえるパターンと waitの無限待ちになるパターンの両方あり。 <コマンド>の内容に依存するのか、タイミング問題で偶々うまく言ったようにみえたのか 判断がつかないため保留中。 ・<コマンド>の後にpause 1を入れる <コマンド>の実行速度が常に一定ではないので、pause 1では間に合わない場合がある。 適切なpause時間の見積りが困難なため保留。 ・戻り値の判定をシェルスクリプトなどで行う  顧客要件により没 以上、よろしくお願い致します。

  • teratermで、ファイル名をinputstrに代入する

    teratermを使って、ftpでputさせたいと思います。 OSは、Linuxベースです。 コマンドラインに於いて $ ls ho* hoge1.txt hoge2.txt   ← この1行を、inputstrに代入させたい 自分で作ってみたのは、こんな感じ timeout = 5 sendln 'ls ho*' result = 0 wait 'ho' if result=1 recvln statusbox result 'result ' pause 1 ; ダイアログボックスを閉じる closesbox messagebox inputstr 'inputstr ' これを実行させると、「$ ls ho*」がinputstr に入っている。何故か? waitによって期待していた文字列(hoge1.txt hoge2.txt)を、inputstr に入れたいと思います。 どうしたらいいでしょうか。

  • teratermマクロ 文字列分岐

    お世話になっております。 下記の件ご教授願えませんでしょうか? teratermを使いサーバに文字列を送り、返ってきた 文字列によって処理を行いたく、下記のようにマクロ を作成したのですが、どうやら、5行目にエラーが発生 してしまい中断という形になってしまいます。 --------------------------------- Prompt1 = '?' sendln 'y' setsync 1 recvln if inputstr = Prompt1 then sendln 'y' else end if setsync 0 --------------------------------- やりたいことは文字列'y'を送信し、 プロンプトで'?'以外の文字列が出力されるまで、 'y'を送信し続ける。 という内容です。 お手数ですがご教授願います。 ちなみにですが、teratermのバージョンは4.57です。

  • 想定外の戻り値に付いて

    Linux系OSのシェルスクリプトについて質問です。 スクリプトの内容としては各主要サービスの起動と停止を行う内容になります。 ここでお伺いしたい内容はスクリプトの途中でサービスが起動しているかどうか、grepの戻り値によって処理を変更する場合にgrepの戻り値がどうにもおかしい場合、どのような原因が考えられるか、ということです。 【スクリプト内容(抜粋)】 #!/bin/bash ---中略--- echo "Apache2起動前確認" | tee -a ${LOG} ps -ef | grep apache2 | grep -v "grep" > /dev/null if [ $? == 0 ]; then ---省略--- 上記の内容はapache2を起動する際、apache2が起動していれば処理を中止する内容の一部ですが、当然起動していればpsコマンドで内容が出るのでgrepの戻り値は0になり、「then」の内容が実施されます。 これはこれで完成されているので問題なく稼動します。 しかしこれとまったく同じ内容で、apache2をmysqlに変更したものが問題でこちらが正常に動作しないのです。 【スクリプト内容(抜粋)】 #!/bin/bash ---中略--- echo "MySQL起動前確認" | tee -a ${LOG} ps -ef | grep mysql | grep -v "grep" > /dev/null if [ $? == 0 ]; then ---省略--- これだとなぜか停止しているときに戻り値が「0」、起動しているときに戻り値が「1」になってしまいます。 ifとpsの間に「echo $?」をかませてみても想定外の戻り値がセットされているためif文そのものには間違いはありません。 また、コマンドラインで「ps -ef | grep mysql | grep -v "grep" > /dev/null ; echo $?」を 実施しても戻り値は「1」に(停止している場合)なるのですが、スクリプト上では戻り値「0」がセットされるようです。 何ゆえこのような意図しない動作をするのか考えてもわかりません。 apache2の場合だと正常に動くだけになおわかりません。 因みに停止しているとき、起動しているときでまったく逆の戻り値がそれぞれ返ってきているようです。 どなたか原因がわかる人は教えてください、宜しくお願いいたします。

  • Excelマクロ戻り値をバッチファイルで取得したい

    下記のように、Windowsのコマンドプロンプトから バッチファイル(test.bat)を実行して、 バッチファイルの中から、 VBスクリプトファイル(test.vbs)を実行して、 VBスクリプトファイルの中から、 Excelブック(Book1.xlsm)の中の main()というマクロを実行させていますが、 以下のことがよく分からないので教えてください。 (問1) Excelマクロmain()の戻り値(result)を、    VBスクリプトファイル(test.vbs)の中で    利用したいのですが、Excelマクロからの    戻り値を取得する方法がよく分かりません。    例えば、WScript.Echoでresultの値を表示するには、    どのように記述すればよいのでしょうか。 (問2) Excelマクロmain()の戻り値(result)を、    バッチファイル(test.bat)の中で    利用したいのですが、VBスクリプトからの    戻り値を取得する方法がよく分かりません。    例えば、echoでresultの値を表示するには、    どのように記述すればよいのでしょうか。 よろしくお願いします。 ---test.bat--------------------------------------- cscript C:\test\test.vbs /A:"C:\test\Book1.xlsm" /B:"main" (ここでechoなどでresultの値を表示したい) -------------------------------------------------- ---test.vbs--------------------------------------- Dim oApp Set oApp = CreateObject("Excel.Application") oApp.Visible = False Set objParm = WScript.Arguments.Named oApp.Workbooks.Open objParm("A") oApp.Run objParm("B") oApp.DisplayAlerts = False oApp.Quit oApp.DisplayAlerts = True (ここでWScript.Echoなどでresultの値を表示したい) -------------------------------------------------- ---Main() (Excelマクロ)--------------------------- Function main() As Integer (処理)  main=result End Function --------------------------------------------------

  • ftpのgetが正常できる方法について

    約100Mバイトのログファイルの差分をとるため、下記のバッチファイルとteratermマクロを実行させました。 やり方は、差分をとりたい2つのログをfptにてサーバーへ転送し、サーバーでsdiffを実行し、差分結果をftpにてとってくるものです。 バッチファイル  echo open xx.xx.xx.xx > "%~dp0put.txt"  echo abcdef >> "%~dp0put.txt"  echo pwabe >> "%~dp0put.txt"  echo put log1 log1 >> "%~dp0put.txt"  echo put log2 10g2 >> "%~dp0put.txt"  echo quit >> "%~dp0put.txt"  ftp -s:"%~dp0put.txt"  del "%~dp0put.txt"  "c:\ProgramFiles\teraterm\ttpmacro.exe" "%~dp0sdiff.ttl"  cho open xx.xx.xx.xx > "%~dp0get.txt"  echo abcdef >> "%~dp0get.txt"  echo pwabc >> "%~dp0get.txt"  echo get kekka kekka >> "%~dp0get.txt"  echo del log1 >> "%~dp0get.txt"  echo del log2 >> "%~dp0get.txt"  echo quit >> "%~dp0get.txt"  ftp -s:"%~dp0get.txt"  del "%~dp0get.txt"  exit/b teraterm macro (sdiff.ttl)  connect'xx.xx.xx.xx.:xx/ssh/2/auth=/user=abcdef/passwd=pwabc'  wait'$'  sendln 'sdiff logl log2 > kekka'  sendln 'mv kekka kekka1'  sendln 'perl -pe "s/\n\r\n/"kekka1 > kekka'   wait'$'  sendln 'rm kekka'  sendln 'rm kekka1'  Sendln 'logout'  end ここから相談です。 ftpでgetしてきた差分は、ログの頭から3分の1程度しかなく、全ての差分をとることができませんでした。 調査したところ、サーバー側はログ全ての差分を取れていることを確認しました。 なぜ、ftpで作業結果をgetすると、3分の1しかないのか原因がわからないまま、試行錯誤で対処方法を見つけたのが次の方法です。 方法1(teraterm macroの変更1)  次のようにwait'$'を追加する。  sendln 'sdiff logl log2 > kekka'  wait'$'  sendln 'mv kekka kekka1'  wait'$'  sendln 'perl -pe "s/\n\r\n/"kekka1 > kekka' 方法2(teraterm macroの変更2)  次のように20秒のpauseをとる。  sendln 'sdiff logl log2 > kekka'  pause 20  sendln 'mv kekka kekka1' 方法1も方法2もタイミングを取るような方法ですが、このやり方で、なぜftpでgetした差分結果が正常(ログすべての差分が取れている)になるのかがわかりません。本当にこの対処でよいか判断できません。 どなたか上記方法でよい理由がお解りでしたら、教えてください。

  • teratermマクロを使ったログイン

    teratermの初心者です。 今、teratermのマクロで”telnetを使ってwindowsマシンにログインする” という基本的な所を作ろうとしているのですが、 teratermインストールディレクトリ内の「login.ttl」を参考に記述し、 コマンドプロンプトから起動をかけると"connect 'ホスト名'"の行で 必ず止まってしまいます。 下記の記述で何処を修正すべきか、ご指摘頂けますと幸いです。 ===================================== testlink if result=0 connect'host' connect 'ホスト名' UsernamePrompt = 'login:' Username = 'ユーザー名\ドメイン' PasswordPrompt = 'Password:' Password = 'パスワード' wait UsernamePrompt sendln Username wait PasswordPrompt sendln Password ===================================== どうぞ宜しくお願い致します。

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • TeraTerm Macroでキー入力待ちにする方法

    TeraTerm Macroでルータに設定を一括で入れよう と思っています。 ただ、途中でコマンド実行結果等を目視で確認 したいので、EnterやY/Nなどの入力を待って から処理を継続したい場合のシンプルな記述方法が あれば教えてください。 一応以下でできる事は確認しました。 Yなら抜けて、Nならdate表示 ---------------------------------------- yesnobox 'Continue? Yes or No' 'moge' if result=0 then sendln 'exit' end endif sendln 'date' ---------------------------------------- Enterの入力を待ってというのはよくわからないです。

  • 関数(list)の戻り値を他の関数(base)の引数に渡したいんですが

    関数(list)の戻り値を他の関数(base)の引数に渡したいんですが、どうすればいいでしょうか? /****list.php****/ <?php function list($id){ // DB接続 open(); $sql = "SELECT * FROM table WHERE id = $id"; $result = mysql_query($sql); // 実行結果判定 if(!$result){ $res = 9; }else{ while ($row = mysql_fetch_assoc($result)){ $moji .= $row['name']; $moji .= $row['mail']; } echo $moji; $res = 0; } return $res; } ?> /****main.php****/ <?php ・ ・ list($id); ・ ↓$err_cdにlistの戻り値を入れ、$err_msgには戻り値が0なら「正常終了」,9なら「SQLエラー」などを入れるようにしたい。 base($err_cd,$err_msg); ・ ?>

    • ベストアンサー
    • PHP