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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1656閲覧

PythonNetmikoのsend_multilineを使用したy/n応答について

riho456

総合スコア22

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/12/07 04:10

編集2022/12/07 06:24

前提

いつもお世話になっております。
Pythonプログラムにお詳しい方がいらっしゃいましたらご教授お願いします。PythonのNetmikoライブラリにあるsend_multilineという機能を使用しネットワーク機器のCLIプロンプト(機器のアップデート)に応答しています。前回の質問を見てコメント頂いた皆さんのお力もあり、応答しアップデートは出来ています。本当にありがとうございました。今回知りたいのは、CLIコマンド上ではy/n応答に対して全て応答が返答できているのですが、send_multilineで実施すると2番目と4番目のy/n応答に返答出来ていません。コメントアウトをつけている事もあるのですが、コメントアウトをはずすと返答がずれてアップデートが成功しません。恐らくcmd_list内の返答部分の記述に問題があると思っています。Python初学者の為、原因や記述方法等のアドバイス等頂けると助かります。

Netmiko公式
https://pynet-twb--tech-com.translate.goog/blog/netmiko4-send-multiline.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc

実現したいこと、知りたいこと

①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

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

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

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

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

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

guest

回答1

0

ベストアンサー

解決するかわかりませんが、コメントしてみます。

text

11 FortiGate found. Include FortiGates in upgrade? (y/n)y^J 20 FortiSwitches found. Include FortiSwitches in upgrade? (y/n) 30 FortiAPs found. Include FortiAPs in upgrade? (y/n)n^J 40 FortiExtenders found. Include FortiExtenders in upgrade? (y/n)

この出力を見ると、 y, n 入力後に「^J」と出ていますが、これは, 「LF」を示しています。 そして、その後の入力が空でリターンされているように見えますので。 これはメッセージ送信時の改行コードが違う (LF / CRLF / CR)のが原因なのではないかと思いました。

netmikoのドキュメントで送信時の改行コードをの設定があるのではないかと見てみると以下の設定をみつけました。
https://ktbyers.github.io/netmiko/docs/netmiko/base_connection.html
ここにある、「default_enter」です。 デフォルトは、「\n」のようですが、 「\r」や「\r\n」に変えてみるのはどうでしょうか。

python

1device = {'device_type': 'fortinet', 2 'ip': 'xxxx', 3 'username': 'xxx', 4 'password': 'xxx', 5 'port': 22, 6 'default_enter': '\r' 7}

投稿2022/12/07 05:56

編集2022/12/07 07:05
TakaiY

総合スコア12743

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

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

riho456

2022/12/07 06:47

TakaiYさん、前回に引き続きお忙しい中コメントありがとうございます。 改行コードなんですね、勉強になります。 試してみたのですが、'default_enter': '\r'をつけた場合、実行結果②の結果になりました。 \r\nにした場合、'FortiGates in upgradeの所でパターンがないと止まっているようです。 両方共コメントアウトはしていません。 申し訳ありません。記載していたipとpasswordを変更しましたので、お手数ですがコメント頂いてる分も記載して頂いた物に修正して頂いてもよろしいでしょうか?間違えて記載してしまいました。引き続き調べてみます。 Traceback (most recent call last): File "send_multiline.py", line 21, 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: 'FortiGates 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.
TakaiY

2022/12/07 07:29 編集

ああ、まず、どのコマンドを使っていますか? ["y", "F"], ["n", "F"], これだと、Fが来たらnを入れるになってしまい、行の中に複数のFがあればそれに反応して入力を打ってしまいます。すると、入力が足りなくなってこのエラーになる可能性があります。 ["y", "FortiSwitches in upgrade?"], ["n", "FortiAPs in upgrade?"], このパターンでやるべきだと思います。
riho456

2022/12/08 02:34

ああ、なるほど。TakaiYさんありがとうございます。 コマンドを下記の形でやってみました。 ["execute federated-upgrade initialize", "immediate | hh:mm YYYY/MM/DD"], ["immediate", "upgraded with"], ["7.2.3", "FortiGates in upgrade?"], ["y", "FortiSwitches in upgrade?"], ["n", "FortiAPs in upgrade?"], ["n", "FortiExtenders in upgrade?"], ["n", "confirm | cancel"], ["confirm", ""] default_enter': '\rをつけた場合はPattern not detected: 'FortiAPs in upgrade?' in output default_enter': '\r\nをつけた場合はPattern not detected: 'FortiGates in upgrade?' in output でひっかかりました。今いろんなパターンで検証してます。
TakaiY

2022/12/08 02:58

netmikoの動作は、人間とちがって「プロンプトが来たら」とか、「画面の出力が止ったら」などは**してくれない**ということを理解することが大事です。 プロンプトがでなかろうが、画面が出力中だろうが条件が合えばコマンド(文字列)を送ってしまいます。 Pattern not detected: 'FortiGates in upgrade?' などが出るということは、想定より早く進んでしまい、** その文字列が出るところより前で ** 待ちに入っているんだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問