前提
いつもお世話になっております。
Pythonプログラムにお詳しい方がいらっしゃいましたらご教授お願いします。PythonのNetmikoライブラリにあるsend_multilineという機能を使用しネットワーク機器のCLIプロンプト(機器のアップデート)に応答しています。前回の質問を見てコメント頂いた皆さんのお力もあり、応答しアップデートは出来ています。本当にありがとうございました。今回知りたいのは、CLIコマンド上ではy/n応答に対して全て応答が返答できているのですが、send_multilineで実施すると2番目と4番目のy/n応答に返答出来ていません。コメントアウトをつけている事もあるのですが、コメントアウトをはずすと返答がずれてアップデートが成功しません。恐らくcmd_list内の返答部分の記述に問題があると思っています。Python初学者の為、原因や記述方法等のアドバイス等頂けると助かります。
実現したいこと、知りたいこと
①Netmikoのsend_multilineを使用して全てのCLIプロンプトに返答したい(できるかどうかわかりませんが)
②Netmikoのsend_multilineを使用した際、(y/n)でy応答ならy^Jと返答、n応答ならn^Jと返答があるが、Python上での^Jの意味を知りたい。
発生している問題・エラーメッセージ
・該当ソースコードのコメントアウトを外さずに実行した場合、アップデートは成功するが特定のy/n応答に返答出来ていない。 ・該当ソースコードのコメントアウトを外して実行した場合、返答がずれアップデートが失敗する。
該当のソースコード
Python
1from netmiko.fortinet import FortinetSSH 2from netmiko import ConnectHandler 3 4device = {'device_type': 'fortinet', 5 'ip': '192.168.1.2', 6 'username': 'admin', 7 'password': 'Password', 8 'port': 22, 9} 10 11with ConnectHandler(**device) as net_connect: 12 13 cmd_list = [ 14 ["execute federated-upgrade initialize", "immediate | hh:mm YYYY/MM/DD"], 15 ["immediate", "upgraded with"], 16 ["7.2.3", "FortiGates in upgrade"], 17 ["y", "F"], 18 ["n", "F"], 19# ["n", "F"], 20# ["n", "c"], 21 ["confirm", ""], 22 ] 23 output = net_connect.send_multiline(cmd_list) 24 print(output)
実行結果1(コメントアウトをはずさずに実行した場合) アップデートは成功するが、特定のy/n応答に返答がない execute federated-upgrade initialize Preparing for federated upgrade... When should the upgrade run? [immediate | hh:mm YYYY/MM/DD] immediate What version or version path should all FortiGates be upgraded with? (Use comma-separated versions with format M.m.p. For example, 1.2.3) 7.2.3 1 FortiGate found. Include FortiGates in upgrade? (y/n)y^J 0 FortiSwitches found. Include FortiSwitches in upgrade? (y/n) ←応答の返答がない 0 FortiAPs found. Include FortiAPs in upgrade? (y/n)n^J 0 FortiExtenders found. Include FortiExtenders in upgrade? (y/n) ←応答の返答がない Summary: Upgrade time: Immediate 1 FortiOS versions in path: 7.2.3 Devices to be upgraded: 1 FortiGate Please confirm the upgrade. [confirm|cancel] confirm FGT60FTK21035539 #
実行結果2(コメントアウトをはずした場合) 返答がずれてアップデートに失敗する execute federated-upgrade initialize Preparing for federated upgrade... When should the upgrade run? [immediate | hh:mm YYYY/MM/DD] immediate What version or version path should all FortiGates be upgraded with? (Use comma-separated versions with format M.m.p. For example, 1.2.3) 7.2.3 1 FortiGate found. Include FortiGates in upgrade? (y/n)y^J 0 FortiSwitches found. Include FortiSwitches in upgrade? (y/n) 0 FortiAPs found. Include FortiAPs in upgrade? (y/n)n^J 0 FortiExtenders found. Include FortiExtenders in upgrade? (y/n) Summary: Upgrade time: Immediate 1 FortiOS versions in path: 7.2.3 Devices to be upgraded: 1 FortiGate Please confirm the upgrade. [confirm|cancel] n Upgrade cancelled. FGT60FTK20009862 # n Unknown action 0 FGT60FTK20009862 # confirm Unknown action 0 FGT60FTK20009862 #
試したこと
cmd_list内の修正して実行
Python
1from netmiko.fortinet import FortinetSSH 2from netmiko import ConnectHandler 3device = {'device_type': 'fortinet', 4 'ip': '192.168.1.2', 5 'username': 'admin', 6 'password': 'Password', 7 'port': 22, 8} 9with ConnectHandler(**device) as net_connect: 10 cmd_list = [ 11 ["execute federated-upgrade initialize", "immediate | hh:mm YYYY/MM/DD"], 12 ["immediate", "upgraded with"], 13 ["7.2.3", "FortiGates in upgrade?"], 14 ["y", "FortiSwitches in upgrade?"], 15 ["n", "FortiAPs in upgrade?"], 16 ["n", "FortiExtenders in upgrade?"], 17 ["n", "confirm | cancel"], 18 ["confirm", ""], 19 ] 20 output = net_connect.send_multiline(cmd_list) 21 print(output)
実行結果 エラーが出力される Traceback (most recent call last): File "send_multiline.py", line 20, in <module> output = net_connect.send_multiline(cmd_list) File "/usr/local/lib/python3.6/site-packages/netmiko/base_connection.py", line 1777, in send_multiline cmd, expect_string=expect_string, **kwargs File "/usr/local/lib/python3.6/site-packages/netmiko/base_connection.py", line 1716, in _send_command_str output = self.send_command(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/netmiko/utilities.py", line 600, in wrapper_decorator return func(self, *args, **kwargs) File "/usr/local/lib/python3.6/site-packages/netmiko/base_connection.py", line 1694, in send_command raise ReadTimeout(msg) netmiko.exceptions.ReadTimeout: Pattern not detected: 'FortiAPs in upgrade?' in output. Things you might try to fix this: 1. Explicitly set your pattern using the expect_string argument. 2. Increase the read_timeout to a larger value. You can also look at the Netmiko session_log or debug log for more information.
補足情報(FW/ツールのバージョンなど)
Python 3.6.8 Netmiko 4.0.0

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/07 06:47
2022/12/07 07:29 編集
2022/12/08 02:34
2022/12/08 02:58