アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

TeraTarmマクロについて質問させていただきます。
※TeraTarmバージョンは4.79です。

<目的>
Windows環境上のコマンドプロンプトから、TeraTarmマクロ「test.ttl」を介して、
Linux環境上の「test.sh」シェルを引数aaa(TeraTarmマクロから引数引き渡し)指定して実行。
さらに、Linux環境上の「test.sh」の終了コードを、TeraTarmマクロを介して、
Windows上のコマンドプロンプト上(%errorlevel%)で取得。


---【Windows環境 実行コマンド】---
c:\> "C:\Program Files (x86)\teraterm\ttpmacro.exe" C:\test.ttl aaa


---【TeraTarmマクロ test.ttl 記述】---
connect '[Linux環境IP]:22 /ssh /2 /auth=password /keyfile= /user=root /passwd=[rootのパスワード]'
shell = '/tmp/work/test.sh'
sendln 'sh ' shell param2
wait '#'

sendln 'echo $?'
recvln
rtncode=inputstr
wait '#'

setexitcode rtncode
closett


---【Linux環境 test.sh 記述】---
#!/bin/sh
echo $1 > /tmp/work/test.log


<質問>
このとき、下記2点の動作がうまくいきません。
・TeraTarmマクロに指定した引数を、シェルの引数として引き渡せない。
・シェルの終了コードをTeraTarmを介してWindows環境のコマンドプロンプトの
 %ERRORLEVEL%に引き渡せない。

試行錯誤してみましたが、私にはどうしても以下のような結果になってしまします。
・/tmp/work/test.logには何も記載が無い。(書き込み権限は付与しています。)
・シェル失敗時のWindows環境(test.ttl)の「echo %errorlevel%」の結果は「0」。

初歩的な事かもしれませんが、どこをどのように直せば目的が果たせるか
ご教示いただければ幸いです。

よろしくお願いします。

A 回答 (2件)

このマクロは、ほとんど使った事が無いですが、サンプルと見比べて気がついた点。



http://sourceforge.jp/magazine/10/01/18/105235/3

connectコマンド後の待ち状態をまたずに、sendln で実行しています。どうなんでしょうね。なぜ待ち状態が必要なのか確認してみましょう。ログインすると通常、ユーザーに設定されたシェルが呼びだされます。例えば root のデフォルトで設定されているシェルは/bin/sh /usr/bin/sh /bin/bash。

つまり # の待ち状態ですね。

> 'sh ' shell param2

これはすでに起動されているシェルの中で、新しいシェルをスクリプトファイルを渡して起動しています。必要ですか?

Shellスクリプトに、 #!bin/sh というおまじないを指定しているので、新たにシェルを起動しなくても sh で実行されます。それが csh bash の環境であっても。

まず、その辺から見直してください。これは困っている問題とは、直接的に関係ないかもしれませんが、変???と思われる事柄です。

次に
>%ERRORLEVEL%に引き渡せない。

ですが、どうやっているんですかね?


if errorlevel 2 echo 2
if errorlevel 1 echo 1

などと記述して初めて正確に把握できますが? %ERRORLEVEL%だと確かに拾えますが、前回のエラーコードが格納されていて、直前ではありません。

まず、サンプルをみて、その完コピ(カラオケじゃねっつーの)して、動作をさぐりましょう。上記サイトのscpsendを別コマンドにして。
    • good
    • 0
この回答へのお礼

引数引き渡しは「ttermpro.exe」ではなく「ttpmacro.exe」に関連付けることで出来ました!
しかし、リターンコードを取得することが未だできません。。

> 次に
> >%ERRORLEVEL%に引き渡せない。
> ですが、どうやっているんですかね?

下記の方法で取得を試みてます。上手くいってませんが(涙)
> シェル失敗時のWindows環境(test.ttl)の「echo %errorlevel%」の結果は「0」。

お礼日時:2013/10/08 00:56

確認ができる環境が無いので、次の方法が正しいかどうかの検証はできていません。



wait '#'
2つありますが、それぞれがズれていないでしょうか?

> sendln 'sh ' shell param2
> wait '#'
で、sh~ 実行終了後のプロンプトを待っているつもりでしょう。
しかし、ログイン直後のプロンプトを待つ前に sendlnが実行されています。
ここでwaitしているのが「ログイン直後のプロンプト」になってませんか?

そうなると
> sendln 'echo $?'
> recvln
このrecvlnで受けとるのは、sendln 'sh ' shell param2の実行結果とか、 コマンドラインそのものだとか、実行直後のプロンプト行とかになってしまうのではないでしょうか。

recvlnで受けとった文字列をmessageboxで表示させる等して確認してはどうでしょうか?
http://ttssh2.sourceforge.jp/manual/ja/macro/com …


また、ログを取ったり、closett をコメントアウトする等して、サーバー側のシェルが実際にどんな動作をしているのか、エラーは出てないか、sh test.sh aaa と正しく実行しているか、等を確認したらどうでしょう?
http://ttssh2.sourceforge.jp/manual/ja/macro/com …

> setexitcode rtncode

通常、終了コードは整数だと思います。
文字列を使って大丈夫ですか?

setexitcode '1'
setexitcode '2'
setexitcode 1
setexitcode 2
それぞれで%ERRORLEVEL% はどうなりますか?
    • good
    • 0
この回答へのお礼

引数引き渡しは「ttermpro.exe」ではなく「ttpmacro.exe」に関連付けることで出来ました!
しかし、リターンコードを取得することが未だできません。。

お礼日時:2013/10/08 00:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!