質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

Q&A

1回答

2001閲覧

TeraTermのTTLファイルにおけるサブルーチン処理について

tennk

総合スコア8

Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

0グッド

0クリップ

投稿2021/10/23 17:04

TeraTermのTTLファイルにおけるサブルーチン処理についての質問です。

現在、発行したコマンド毎に「ホスト名_日付_発行コマンド.log」というファイル名のログを取得する
TTLファイルを作成中です。
取得するコマンドは別フォルダ内にあるテキストファイルを参照させるようにしています。

######(例 ホスト名が「Test」の機器にTTLを実行した場合の結果
show running-config
show interface status

→Test_202110241000_show running-config.log
→Test_202110241000_show interface status.log

これまでは普通のコマンドは成功していたのですが
「"」「<」「>」「:」などwindowsのファイル名として使用できない文字列がコマンドに含まれていると
ファイル名がバグった状態で出力されてしまいます。(なお出力内容は問題なし。)

このバグを解消しようと考え
「"」「<」「>」「:」などが入っている場合その文字を削除してファイル名に適用するサブルーチンを作成しました。
考案したのは下記のようなコードになります。

;個別ログ取得開始 afscan = ""   //「"」「<」「>」「:」などを削除した後の文字列を格納するための変数。ここでは単に変数として事前に定義しています。 indlog = indlogname //ファイル名テンプレート。この時点では「ホスト名_日付_」までが格納されている。 fileopen FileHandle2 cmdlist 0 //cmdlist変数には取得するコマンドリストファイルのパスが格納されている while 1 filereadln FileHandle2 cmdline //cmdlistから受け取った各行のコマンドがループ毎に読み込まれる if result = 1 break call FN_replace //「"」「<」「>」「:」などをコマンドから除去するサブルーチン strconcat indlog afscan //indlog変数にサブルーチンでwindowsで使用不可な文字を削除したコマンドを付与する。 //例: show flash:なら 「ホスト名_日付_show flash」 となる strconcat indlog '.log' //indlog変数の値に「.log」を付け足す。 logopen indlog 0 1 //ログ取得開始 sendln cmdline //cmdlineに格納されたコマンドの発行 wait HostName //HostNameには機器ホスト名が格納されている。 flushrecv logclose indlog = indlogname          //indlog変数の初期化 これにより「ホスト名_日付」に値が戻る。 endwhile fileclose FileHandle sendln 'exit' end :FN_replace strscan cmdline ':'           //cmdlineで取得したコマンドに : が入っているかの精査 if result != 0 then //「:」が入っていた場合 afscan = cmdline // afscanにコマンドを格納 strreplace afscan 1 ':' '' //afscan内のコマンドの:を削除する endif strscan cmdline '/' //以降は「:」の時と同じ処理を行います。 if result != 0 then afscan = cmdline strreplace afscan 1 '/' '_' endif strscan cmdline '\' if result != 0 then afscan = cmdline strreplace afscan 1 '\' '' endif strscan cmdline '*' if result != 0 then afscan = cmdline strreplace afscan 1 '*' '' endif strscan cmdline '?' if result != 0 then afscan = cmdline strreplace afscan 1 '?' '' endif strscan cmdline '"' if result != 0 then afscan = cmdline strreplace afscan 1 '"' '' endif strscan cmdline '<' if result != 0 then afscan = cmdline strreplace afscan 1 '<' '' endif strscan cmdline '>' if result != 0 then afscan = cmdline strreplace afscan 1 '>' '' endif strscan cmdline '|' if result != 0 then afscan = cmdline strreplace afscan 1 '|' '' endif return

以上のコードでうまくいくと思っていましたが。
テストで下記コマンドを取得したところ

show run
show interface status
show flash:
dir
dir flash:
show interfaces gigabitEthernet 0/1
show run | i vlan
show run | b vlan

ファイル名に使用できない文字は削除されてログファイル名はバグらなくなったのですが
取得内容がログファイル名と合致しない、分断されてしまうといった状況が発生しています。

###ファイル名:Test_20211018_211153_.log

Test#show run Current configuration : 4515 bytes ! ! Last configuration change at 02:43:16 UTC Wed Dec 1 1993 ! version 15.0 no service pad service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption ! hostname Test ! boot-start-marker boot-end-marker ! enable secret 5 $1$FRjx$U7MiPqAEV.ORQILRDeOXx. ! username genji password 0 xxxxxxxxxxx no aaa new-model system mtu routing 1500 ! ! no ip domain-lookup ip domain-name xxxxxxxxxxxxxxx ! ! crypto pki trustpoint TP-self-signed-1883220480 enrollment selfsigned subject-name cn=IOS-Self-Signed-Certificate-1883220480 revocation-check none rsakeypair TP-self-signed-1883220480 ! ! crypto pki certificate chain TP-self-signed-1883220480 certificate self-signed 01 30820250 308201B9 A0030201 02020101 300D0609 2A864886 F70D0101 04050030 31312F30 2D060355 04031326 494F532D 53656C66 2D536967 6E65642D 43657274 69666963 6174652D 31383833 32323034 3830301E 170D3933 30333031 30303031 31325A17 0D323030 31303130 30303030 305A3031 312F302D 06035504 03132649 4F532D53 656C662D 5369676E 65642D43 65727469 66696361 74652D31 38383332 32303438 3030819F 300D0609 2A864886 F70D0101 01050003 818D0030 81890281 810096B0 ED6331E6 098507FC 26DF189C 6D50A55B C331ADC9 2AFE2E7B A57BBDB8 45140B10 416FE754 D04055CD F47FA34F 75616CDE 333894D8 824D7841 E7C45961 C7A935B8 07692DAA 103447B1 9EBC83A8 50088DBF EE780DE3 F12D1FF6 0B4E8A83 26E76FB9 3FFF6E8A 133098A4 1D09ECD6 67617AD1 4E1CBE0B 15A4349B 13339EC0 7E370203 010001A3 7830763

###ファイル名:Test_20211018_211153_show flash.log

spanning-tree portfast ! interface GigabitEthernet0/3 description alter_seg_2_HOST switchport access vlan 200 spanning-tree portfast ! interface GigabitEthernet0/4 description alter_seg_2_RT switchport access vlan 200 switchport mode trunk spanning-tree portfast ! interface GigabitEthernet0/5 spanning-tree portfast ! interface GigabitEthernet0/6 description spanning-tree portfast ! interface GigabitEthernet0/7 spanning-tree portfast ! interface GigabitEthernet0/8 spanning-tree portfast ! interface GigabitEthernet0/9 description spanning-tree portfast ! interface GigabitEthernet0/10 description PS4 spanning-tree portfast ! interface GigabitEthernet0/11 spanning-tree portfast ! interface GigabitEthernet0/12 spanning-tree portfast ! interface GigabitEthernet0/13 spanning-tree portfast ! interface GigabitEthernet0/14 spanning-tree portfast ! interface GigabitEthernet0/15 spanning-tree portfast ! interface GigabitEthernet0/16 spanning-tree portfast ! interface GigabitEthernet0/17 spanning-tree portfast ! interface GigabitEthernet0/18 description ps4_packets_monitor switchport mode access spanning-tree portfast ! interface GigabitEthernet0/19 description recove_port switchport access vlan 10 spanning-tree portfast ! interface GigabitEthernet0/20 description Buffalo-router ! interface GigabitEthernet0/21 spanning-tree portfast ! interface GigabitEthernet0/22 spanning-tree portfast ! interface GigabitEthernet0/23 spanning-tree portfast ! interface GigabitEthernet0/24 spanning-tree portfast ! interface Vlan1 ip address 192.168.xxx.xxxx 255.255.255.0 no ip route-cache ! interface Vlan10 ip address 192.168.1.254 255.255.255.0 ! ip default-gateway 192.168.xx.xxx no ip http server no ip http secure-server logging esm config ! line con 0 password xxxx login line vty 0 4 login local transport input telnet ssh line vty 5 15 login transport input telnet ssh ! ! monitor session 1 source interface Gi0/9 - 10 monitor session 1 destination interface Gi0/18 end Test#show interface status Port Name Status Vlan Duplex Speed Type Gi0/1 alter_seg_1_HOST notconnect 100 auto auto 10/100/1000BaseTX Gi0/2 alter_seg_1_RT notconnect 100 auto auto 10/100/1000BaseTX Gi0/3 alter_seg_2_HOST notconnect 200 auto auto 10/100/1000BaseTX Gi0/4 alter_seg_2_RT notconnect 200 auto auto 10/100/1000BaseTX Gi0/5 notconnect 1 auto auto 10/100/1000BaseTX Gi0/6 xxxxxxx connected 1 a-full a-1000 10/100/1000BaseTX Gi0/7 notconnect 1 auto auto 10/100/1000BaseTX Gi0/8 notconnect 1 auto auto 10/100/1000BaseTX Gi0/9 xxxxxxx notconnect 1 auto auto 10/100/1000BaseTX Gi0/10 xxx connected 1 a-full a-100 10/100/1000BaseTX Gi0/11 connected 1 a-full a-1000 10/100/1000BaseTX Gi0/12 notconnect 1 auto auto 10/100/1000BaseTX Gi0/13 notconnect 1 auto auto 10/100/1000BaseTX Gi0/14 notconnect 1 auto auto 10/100/1000BaseTX Gi0/15 notconnect 1 auto auto 10/100/1000BaseTX Gi0/16 notconnect 1 auto auto 10/100/1000BaseTX Gi0/17 notconnect 1 auto auto 10/100/1000BaseTX Gi0/18 ps4_packets_monito notconnect 1 auto auto 10/100/1000BaseTX Gi0/19 recove_port notconnect 10 auto auto 10/100/1000BaseTX Gi0/20 xxxxxxxxxxx connected 1 a-full a-1000 10/100/1000BaseTX Gi0/21 notconnect 1 auto auto 10/100/1000Bbytes total (13405184 bytes free) Test#dir

※show interfaceはそもそもログとして取得されてすらいませんでした。
以上のことからお聞きしたいことは下記になります。

・このコードでおかしな点はどちらになりますでしょうか。
・このコードで直すべき点はどちらになりますでしょうか。

他に必要な情報などがあればおっしゃっていただければ提供いたしますので
ご教授いただければ幸いです、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ファイルオープン時のハンドル名と、ファイルクローズ時のハンドル名が異なります。
また、実行がおかしいということですので、以下のような調査ができると思います。

  1. messageboxでcmdlineの中身を確認する

 messagebox cmdline '発行コマンド'
2. sendln 'exit'をいったんコメント化して、セッションを切らない状態に変更。発行されているコマンドを確認

投稿2021/12/22 01:45

Ytaka

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問