グッドデザイン賞を受賞したウォーターサーバー >>

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 …参照
----------------------------------------------------------
sendln 'echo $?'
recvln
recvln

hensu=inputstr ←Type mismatch.のエラーになる。 直前にstr2intを入れたりしても駄目でした。
ちなみにsendln 'echo $?'を挟まずsendmsgの直後にrecvlnでも駄目です。

if hensu = 0 then
 ○○
elseif hensu = 1 then
----------------------------------------------------------

host1にシェルスクリプトを入れることは出来ません。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

基本方針は、echo $? の出力文字をttlで受信して判定、でいいと思います。



・inputstrは文字列なので、=での比較はできません
strcompareコマンドで比較→変数resultで判定
あるいは
str2int 変数 intputstr で変数に数値化→if 変数=0 等と判定
ということになります。
http://ttssh2.sourceforge.jp/manual/ja/macro/syn …
http://ttssh2.sourceforge.jp/manual/ja/macro/com …
http://ttssh2.sourceforge.jp/manual/ja/macro/com …


・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/com …

この回答への補足

以下で試しましたが、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

補足日時:2013/09/23 12:20
    • good
    • 3
この回答へのお礼

頂いた内容を合わせて出来ました。ちゃんと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

お礼日時:2013/09/23 12:24

ちょいと試してみました。


# 接続先はCentOS 6.4のbashです。

----------------------------------------------------------
setsync 1
sendln 'echo $?'
recvln
recvln

if result = 1 then
messagebox inputstr "Result"
endif
----------------------------------------------------------
で、falseコマンド実行後は1が、trueコマンド実行後は0が表示されました。

動機モードになっていなかったため、recvlnを実行したときには受信処理が終わっていたのではないでしょうか?

この回答への補足

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

補足日時:2013/09/23 12:03
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q[teraterm] waitコマンドで停止しない。

お世話になっております。
現在teratermのマクロを作成しているのですが、waitコマンドがうまく動いてくれない箇所があります。
どなたか解決策をご教授いただけないでしょうか。

【質問】
UNIX上にてシェルを実行後、コマンドプロンプトが戻ってきた時点で"echo $?"にてシェルのリターンコードを確認するマクロを作成しています。しかし、シェルの終了に時間がかかるためか、コマンドプロンプトが戻ってくるのを確認せずに"echo $?"を実行してしまっています。

【プログラム(該当箇所)】
timeout=20
sendln 'シェルの実行'
wait ']$ '
sendln 'echo $?'
wait '0'

【コンソール上】
]$ シェルの実行
echo $?
シェルの実行結果
]$

以上、よろしくお願いいたします。

Aベストアンサー

sendln 'シェルの実行'
の直後へ
pause 1
を入れてみてはどうでしょうか。(1秒間停止してつぎへ進みます)

それでだめなら、
wait ']$ '
で]$を待っていますが、シェルの実行中に、この]$がでてないか確認して下さい。
実行後のコマンドプロンプトが、[XXX]になることが決定しているなら
wait '[XXX]'としてみて下さい。XXXはあなたの環境で表示される文字列です。

Q【Teratermマクロ】文字列の一致比較について

If文を用いて、文字列同士が同じかを確かめたいのですが
If文では数字のみしか比較できないらしいということがわかりました。

Teratermの場合、他の方法などで文字列の一致を確認できないのでしょうか?

ご存知の方がいらっしゃいましたら、是非教えて下さい。

Aベストアンサー

そんなあなたに: strcompare

他にも、strmatch(要バージョン4.59以降)などあります。
詳しくは、TTLコマンドリファレンスをご覧ください。

QTeraTermマクロのinputboxで入力した値をメッセージ確認表示するには?

TeraTermマクロを使用し、inputboxで獲得した値を
確認メッセージ(yesnobox)に表示するにはどのような書き方をすれば良いでしょうか?

;retry
inputbox '該当のインターフェースを入力してください。''input interface'
yesnobox inputstr 'のインターフェースで良いですか?'
if result=0 then
goto retry
else
endif
sendln 'command' ←例えばその後、OKならコマンドを実行。


入力したインターフェースで間違いないか確認表示したいのですが
どのように書けば良いのでしょうか?

上記書き方では間違ってるのでエラーとなってしまいます。

Aベストアンサー

;retry
inputbox '該当のインターフェースを入力してください。''input interface'
mes = inputstr
strconcat mes 'のインターフェースで良いですか?'
yesnobox mes
if result=0 then
goto retry
else
endif

って感じでしょうかね。
一度変数に入れてからstrconcatで連結する。ということに。

Qtera term マクロのinputbox

teratermマクロでinputboxを使い、
機器へ接続しています。
何も入力されない場合、終了させたいのですが、
if inputstr = "" goto end
ではダメみたいなのですが、
どなたか良い方法ございましたら、
ご教授のほど宜しくお願い致します。

Aベストアンサー

strcompare inputstr ''
if result = 0 then
end
で、いけると思います。

参考URL:http://ttssh2.sourceforge.jp/manual/ja/macro/

QTERA TERMを隠す方法

TERA TERMでマクロを起動した時、
実行結果の画面が出力されますが
これを最小化もしくはバックグラウンドで
見せないように起動する方法があれば
教えてください。
マクロのオプション /V や /I では
見せないようにすることができませんでした、
何か方法があれば教えてくださいませ。

Aベストアンサー

connect '/I xxx.xxx.xxx.xxx'のように
connectのオプションに/Iをつけてください。

QTeraTermマクロの文字列結合

hostname = "100.100.100.100"
log="20101010"

という変数をteratermマクロで設定しております。
この二つの変数の間に、空白または_(アンダーバー)を一つ入れて

"100.100.100.100_20101010"
という文字列を作成して、変数に格納するなりしたいのです。

ただ、hostname変数とlog変数の中身は変えれないので、
hostname = "100.100.100.100_"や、log="_20101010"の
このやり方以外でお願いします。

ご教授よろしくお願いします。

Aベストアンサー

sprintf2 ver '%s_%s' hostname log

でverに入ります。

Qttlマクロによるディレクトリ配下の取得

シェルスクリプトで、apacheのhtmlディレクトリを取得しバックアップを作成しております。
シェルスクリプトは、ユーザshコマンドによる実行です。(cronでは動かしておりません。)

保存先:/home/test/html_backup/配下
保存ファイル名:yyyymmdd.tar.gz(yyyymmddシェルスクリプト実行日となる。)

よって、/home/test/html_backup/ディレクトリ配下にある複数のバックアップ全てを、
マクロによるscp転送で取得したいと考えています。

同名ファイルが存在する場合は、常に上書きでかまいません。


サーバに接続後、下記コマンドを実行しようと思いました。

wait '$'
scprecv '/home/test/html_backup/*'
scprecv '*' 'c:\temp'


としましたが、うまくマクロが動きません。
sendlnでファイル転送ができることはわかりましたか、
今回やろうとしていることは、複数のバックアップファイルがあるため
自動でsendlnでは難しいと思っております。


どのようにttlを書けば
バックアップファイルを全部取得できるのでしょうか。

ご教授お願いいたします。

シェルスクリプトで、apacheのhtmlディレクトリを取得しバックアップを作成しております。
シェルスクリプトは、ユーザshコマンドによる実行です。(cronでは動かしておりません。)

保存先:/home/test/html_backup/配下
保存ファイル名:yyyymmdd.tar.gz(yyyymmddシェルスクリプト実行日となる。)

よって、/home/test/html_backup/ディレクトリ配下にある複数のバックアップ全てを、
マクロによるscp転送で取得したいと考えています。

同名ファイルが存在する場合は、常に上書きでかまいません。


サーバに接...続きを読む

Aベストアンサー

scprecvで指定するのはファイル名なので、ファイル名を指定しないと駄目でしょう。

ls -1 して、結果を recvln して、scprecv するのでしょうか。

私なら、Teratermを使わずに、Puttyパッケージの pscp (Windows用scpコマンド) を使って、
C:\temp>pscp -r -i id.ppk -P port user@host /home/test/html_backup .
としますね。

WinSCPのコマンドラインオプションでも同様のことは出来ると思います。

QTeratermマクロの戻り値の取得失敗

Teratermマクロで、/etc/sysconfig/i18nファイルのLANG設定を確認しようとしています。
(LANG="ja_JP.UTF-8"となっているのを確認しようとしています)
以下の内容で、recvlnでコマンドの戻り値が取得できません。
messagebox で表示させると、コマンド結果の最終行”[root@tk2-222-20767 ~]#”しか取得できません。
recvlnでコマンドの戻り値にLANG="ja_JP.UTF-8"を取得させたいのですが、方法がわかりません。
ご教授願います。よろしくお願いします。

*************コマンド結果*************
[root@tk2-222-20767 ~]# grep LANG /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
[root@tk2-222-20767 ~]#

**************マクロ*****************
; Check1
flushrecv
sendln 'grep LANG /etc/sysconfig/i18n'
mpause 500
wait '$' '#'

;+++++++++++ Check +++++++++++
loopFlag = 1
checkFlag = 0
while loopFlag = 1
; 一行受信
recvln
if result = 0 loopFlag = 0
line = inputstr
messagebox line "DEBUG112"
; Check
strcompare 'LANG="ja_JP.UTF-8"' line
if result = 0 checkFlag = 1
endwhile

Teratermマクロで、/etc/sysconfig/i18nファイルのLANG設定を確認しようとしています。
(LANG="ja_JP.UTF-8"となっているのを確認しようとしています)
以下の内容で、recvlnでコマンドの戻り値が取得できません。
messagebox で表示させると、コマンド結果の最終行”[root@tk2-222-20767 ~]#”しか取得できません。
recvlnでコマンドの戻り値にLANG="ja_JP.UTF-8"を取得させたいのですが、方法がわかりません。
ご教授願います。よろしくお願いします。

*************コマンド結果*************
[root@tk...続きを読む

Aベストアンサー

flushrecv ; 受信バッファをクリアして
sendln 'grep LANG /etc/sysconfig/i18n' ; grepコマンドを送って
mpause 500 ;少し待った後
wait '$' '#' : $ か # が送られてくるまで待つ

その後で recvln で読み込む

というプログラムになっていることは理解できてますか?


[root@tk2-222-20767 ~]# grep LANG /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"
[root@tk2-222-20767 ~]#

のうち、
最初の[root@tk2-222-20767 ~]# までが flashrecv の対象で、
grep LANG /etc/sysconfig/i18n は sendlnしたもの。
そのあとで 、$ か#まで待つ(=読み飛ばす)と、どこになると思いますか?

Qteratermで、ファイル名を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 に入れたいと思います。

どうしたらいいでしょうか。

Aベストアンサー

waiitしたときに、画面に表示される ls ho* も受信していますので、
以下のようにすればよいかと。
1案
ls ho*を含まない文字で待つ
wait 'txt' のようにする。
2案
最初に、ls ho*の分を読んでしまう。
sendln 'ls ho*'
recvln  ・・・・この行を追加
result = 0

以上の何れかの方法でいかがでしょうか。

QTeratermで、条件分岐させたい

Teratermでサーバに自動ログインし作業するためのマクロを作成中です。
条件分岐が発生するコマンド実行後、ユーザが入力した内容で実行したいと思っています。

例えば、
1.sendln 'yum update パッケージ' を実行。
2..Is this ok [y/N]: と表示されたことを確認後、ユーザーにy か N を問い合わせる。
3.ユーザが入力した内容を元に、sendln でyかNを実行し、アップデートを実行。

teratermマクロでこのようなことは出来ますでしょうか?
ご教授お願いします。

Aベストアンサー

ちゃんと読んでますか?

例えば
http://ttssh2.sourceforge.jp/manual/ja/macro/command/recvln.html
> ホストから一行分の文字を受信し、システム変数 inputstr に格納する。

もう一度、ちゃんと読んでください。
「inputstr に格納する」ってなっている関数がいっぱいあります


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング