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

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

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

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

Python

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

解決済

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

riho456
riho1128

総合スコア19

Python 3.x

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

Python

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

1回答

0グッド

0クリップ

248閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答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

総合スコア10458

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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?' などが出るということは、想定より早く進んでしまい、** その文字列が出るところより前で ** 待ちに入っているんだと思います。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

Python

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