最近一直在測(cè)試Python中通過(guò)ssh協(xié)議連接huawei、h4c等網(wǎng)絡(luò)設(shè)備的paramiko和netmiko模塊。為什么選用這兩個(gè)自己去網(wǎng)上找答案。
有關(guān)paramiko模塊連接網(wǎng)絡(luò)設(shè)備的例子和遇到的問(wèn)題,煩請(qǐng)參考:https://blog.51cto.com/chier11/2116155
本文只介紹使用netmiko模塊連接H3C網(wǎng)絡(luò)設(shè)備,并成功閉坑:h4c分屏顯示的問(wèn)題。
發(fā)發(fā)牢騷:netmiko連接huawei設(shè)備的時(shí)候,在netmiko模塊中會(huì)自動(dòng)去掉分屏顯示功能,意思就是說(shuō)所有大量信息全部顯示出來(lái),舉例:display interface brief,查看400多端口的信息,系統(tǒng)會(huì)分屏顯示,但是在netmiko的huawei模塊中默認(rèn)設(shè)置了取消分屏顯示的指令,如下:screen-length 0 temporary(華為取消分屏顯示的命令)
廣安網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
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)
這里大概猜測(cè)了下,為什么在netmiko模塊在huawei的連接中有取消分屏顯示功能的命令,而H3C設(shè)備沒(méi)有呢,經(jīng)過(guò)和廠(chǎng)家溝通發(fā)現(xiàn),華為設(shè)備的取消分屏顯示功能可以針對(duì)用戶(hù)設(shè)置,而且是臨時(shí)。舉個(gè)例子:一個(gè)user用戶(hù)登錄華為設(shè)備后執(zhí)行取消分屏顯示命令后對(duì)設(shè)備中其他用戶(hù)沒(méi)影響(其他用戶(hù)還是分屏顯示),當(dāng)user用戶(hù)退出ssh的時(shí)候該用戶(hù)的分屏顯示功能會(huì)自動(dòng)恢復(fù),就像定義了:進(jìn)入自己家目錄的環(huán)境一樣方便強(qiáng)大。而H3C網(wǎng)絡(luò)設(shè)備的分屏顯示針對(duì)的是全局設(shè)備,而且并不是進(jìn)入、退出環(huán)境那樣臨時(shí)性生效一樣。那么如何解決這種坑呢,經(jīng)過(guò)多次網(wǎng)上查找和多次測(cè)試,終于完美實(shí)現(xiàn)一次性顯示完整的輸出大量信息。
if "---- More ----" in outp:
outp += conn1.send_command_timing(
' \n', strip_prompt=False, strip_command=False, normalize=False
) ###遇到more,就多輸入幾次個(gè)空格,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,就多輸入幾次個(gè)空格,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()
以上是在實(shí)際中對(duì)華為和華三廠(chǎng)家的命令使用中的區(qū)別總結(jié)。如有不妥之處煩請(qǐng)大家指正。