使用netmiko模塊連接H3C設備(閉坑——H3C設備的分屏顯示)

最近一直在測試Python中通過ssh協議連接huawei、h3c等網絡設備的paramiko和netmiko模塊。爲什麼選用這兩個自己去網上找答案。
有關paramiko模塊連接網絡設備的例子和遇到的問題,煩請參考:https://blog.51cto.com/chier11/2116155
本文只介紹使用netmiko模塊連接H3C網絡設備,併成功閉坑:h3c分屏顯示的問題。
發發牢騷:netmiko連接huawei設備的時候,在netmiko模塊中會自動去掉分屏顯示功能,意思就是說所有大量信息全部顯示出來,舉例:display interface brief,查看400多端口的信息,系統會分屏顯示,但是在netmiko的huawei模塊中默認設置了取消分屏顯示的指令,如下:screen-length 0 temporary(華爲取消分屏顯示的命令)


from __future__ import print_function
from __future__ import unicode_literals
import time
import re
from netmiko.cisco_base_connection import CiscoBaseConnection
from netmiko.ssh_exception import NetMikoAuthenticationException
from netmiko import log

class HuaweiBase(CiscoBaseConnection):
    def session_preparation(self):
        """Prepare the session after the connection has been established."""
        self._test_channel_read()
        self.set_base_prompt()
        self.disable_paging(command="screen-length 0 temporary")
        # Clear the read buffer
        time.sleep(0.3 * self.global_delay_factor)
        self.clear_buffer()

    def config_mode(self, config_command="system-view"):
        """Enter configuration mode."""
return super(HuaweiBase, self).config_mode(config_command=config_command)

這裏大概猜測了下,爲什麼在netmiko模塊在huawei的連接中有取消分屏顯示功能的命令,而H3C設備沒有呢,經過和廠家溝通發現,華爲設備的取消分屏顯示功能可以針對用戶設置,而且是臨時。舉個例子:一個user用戶登錄華爲設備後執行取消分屏顯示命令後對設備中其他用戶沒影響(其他用戶還是分屏顯示),當user用戶推出來的時候分屏顯示功能就自動恢復,就像定義了 進入自己家目錄的環境一樣方便強大。而H3C網絡設備的分屏顯示針對的是全局設備,而且並不是進入退出環境那樣臨時性生效一樣。那麼如何解決這種坑呢,經過多次網上查找和多次測試,終於完美實現一次性顯示完整的輸出大量信息
if "---- More ----" in outp:
outp += conn1.send_command_timing(
' \n', strip_prompt=False, strip_command=False, normalize=False
) ###遇到more,就多輸入幾次個空格,normalize=False表示不取消命令前後空格
代碼如下,


from netmiko import ConnectHandler
from netmiko.ssh_exception import NetMikoTimeoutException
from netmiko.ssh_exception import NetMikoAuthenticationException

def Get_CRC():
    try:
        pynet1 = {
        'device_type': "hp_comware",
        'ip': "10.10.10.10",
        'username': "CTyunuser",
        'password': "P@ssw0rd6900",
        }
        conn1 = ConnectHandler(**pynet1)
        cmd='display counters inbound interface '
        #cmd = 'display interface brief \n'
        outp=conn1.send_command_timing(cmd)
        if "---- More ----" in outp:
            outp += conn1.send_command_timing(
                '            \n', strip_prompt=False, strip_command=False, normalize=False
            )      *###遇到more,就多輸入幾次個空格,normalize=False表示不取消命令前後空格*。
        outp1 = outp.split("\n")
        print (outp1)

    except (EOFError,NetMikoTimeoutException):
        print('Can not connect to Device')
    except (EOFError, NetMikoAuthenticationException):
        print('username/password wrong!')
    except (ValueError, NetMikoAuthenticationException):
        print('enable password wrong!')

if __name__=="__main__":
     Get_CRC()

以上是在實際中對華爲和華三廠家的命令使用中的區別總結。如有不妥之處煩請大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章