【Python】Ciscoルーター複数台にTelnetしてログ取得 for文利用

先日、for文を用いた複数台Telnetしログ取得するプログラムについて

上手く動作しませんでしたが、原因が分かり解決できました。

 

単純に、tn.read_until(b"Password:")から最後のprintまでインデントがずれていただけでした。

下図の状態だと、tn=Telnetlib.Telnet(x)しかfor文の中に入ってないので

1回目は.100代入のみ、2回目.101代入した後にtn.read_until(b"Password:)へ進むので

結果として2回目のログしか出てこなかった。

【先日のコード】

import getpass
import telnetlib

IPlist = ["192.168.0.100","192.168.0.101"]
Password = getpass.getpass()

for x in IPlist:
tn = telnetlib.Telnet(x) #リストの先頭から順番にTelnet

tn.read_until(b"Password:") #Password:」表示まで待機
tn.write(Password.encode("ascii")+ b"\n") #パスワード入力

#Ciscoコマンド実行
tn.write(b"show clock"+ b"\n") #show clockコマンド実行
tn.write(b"exit"+b"\n") #exitコマンド実行

print(tn.read_all().decode("ascii"))

 

本日、下図のようなコードに変えて

自動で2台へアクセスしてログ表示させる事できました。

for文に2つの変数を利用。

zip()は、IPリストとPassリストの[0]から値を順番取得して、x,yに代入してます。

x←IPlist y←Passlist

1回目:192.168.0.100にアクセスし、パスワード123を入力。

2回目:192.168.0.101にアクセスし、パスワード666を入力。

 

ちなみに、for x,y in IPlist,Passlistにすると

1回目:x←192.168.0.100 y←192.168.0.101になってダメでした。。

 

【変更後のコード】

#import getpass
import telnetlib

IPlist = ["192.168.0.100","192.168.0.101"]
Passlist = ["123","666"]

for x,y in zip(IPlist,Passlist):

tn = telnetlib.Telnet(x) #リストの先頭から順番にTelnet


tn.read_until(b"Password:") #Password:」表示まで待機
tn.write(y.encode("ascii")+ b"\n") #パスワード入力

#Ciscoコマンド実行
tn.write(b"show clock"+ b"\n") #show clockコマンド実行
tn.write(b"exit"+b"\n") #exitコマンド実行


print(tn.read_all().decode("ascii"))

 

【実行結果】

f:id:slavex:20210704223821p:plain