安裝 pip install netmiko
關聯包:scp,pyyam1,pyserial,textfsm,enum34,ipaddress,cryptography,pyasn1,six,cffi,asn1crypto,idna,pycparser
優勢:
支持telnet和ssh連接
連接設備方便
簡化執行命令和取回輸出數據
簡化配置命令和提交動作
能在各個平台上執行以上動作
支持的平台:
普通設備類型,例如 cisco_ios、hp_procurve
傳送文件的設備類型,例如 cisco_ios、juniper_junos
telent的設備類型,例如 cisco_ios_telnet,hp_procurve_telnet
Serial型號,例如 cisco_ios_serial'
jumper類型:terminal_server
1.1 BaseConnection
class netmiko.base_connection.BaseConnection() __init__(ip='', host='', username='', password='', secret='', port=None, device_type='', verbose=False, global_delay_factor=1, use_keys=False, key_file=None, allow_agent=False, ssh_strict=False, system_host_keys=False, alt_host_keys=False, alt_key_file='', ssh_config_file=None, timeout=100,session_timeout=60, blocking_timeout=8, keepalive=0, default_enter=None,response_return=None, serial_settings=None, fast_cli=False, session_log=None, session_log_record_writes=False, session_log_file_mode='write') __enter__() #建立session __exit__(exe_type,exc_value,traceback) #關閉連接
ip #str,目標設備的ip地址,如果host參數有值,此項可為空 host #str,目標設備名稱,如果ip參數有值,此項可為空 username #str,目標設備的登錄用戶名 pasword #str,目標設備的登錄密碼 secret #str,目標設備enable 密碼 port #int/None,目標設備的連接端口,會根據device type類型來自動判斷port是哪個,所以此項可以不填 device_type #str,目標設備的設備類型 verbose #bool,允許在標准輸出中添加附加信息 global_delay_factor#int,默認為1,各種因素造成的netmiko延時 use_keys#bool,用ssh keys連接目標設備 key_file#str,ssh key的文件路徑 allow_agent#bool,允許用ssh key-agent ssh_strict#bool,默認False,自動拒絕不知道的ssh host keys system_host_keys#bool,導入host keys從用戶已知的hosts文件中 alt_host_keys#bool,如果是True,host keys被導入從alt_key_file alt_key_file#str,ssh host key文件,(如果alt_host_keys=True) ssh_config_file#str,OpenSSH配置文件名稱 timeout #float,連接超時時間,默認為100 session_timeout #float,每個請求的超時時間,默認為60
bocking_timeout #int, 默認為8,是給ssh連接中的paramiko中的session超時方法設置的時間
keepalive #int,默認為0,保持連接活躍,是給ssh連接中paramiko中的keepalive方法設置的時間 default_enter #str,默認的回車字符, 為'\n' reponse_return #str,默認返回的回車字符,為'\n' fast_cli #boolean,默認False。當為真時,返回delay_factor和global_delay_factor比較小的那個值,為false時返回比較大的那個值
session_log #str,session log文件路徑,默認None session_log_record_writes #boolean,默認False session_log_file_mode #str,默認write,當session_log寫好文件路徑后,在這個參數中,寫模式是‘w’,追加模式是‘append’
from netmiko import ConnectHandler cisco_881 = { "device_type": "cisco_ios", #device_type 必須得是包支持的類型 "ip":"10.10.10.227", #ip和host二者寫其一即可 "host":"", "username":"pyclass", "password":"password", "port" : 23, #默認22 "secret": "secret", #默認 '' 此項為enable password "verbose": False, #默認False,是否允許附加信息在標准的輸出中 "global_delay_factor": 1, #並非是超時設置,而是控制各種操作的延時,大多數情況下不需要設置此項,除非是一些設備運行緩慢,尤其是虛擬設備,會導致程序緩慢,也可以給專門的命令增加延時時間,默認0.5秒, "use_key" : False, "key_file": None, "allow_agent" : False, "ssh_strict": False, "system_host_keys": False, "alt_host_keys" : False, "alt_key_file": "", "ssh_config_file": None, "timeout" : 8, #連接超時時間,默認為8秒 "session_timeout": 60, "blocking_timeout":8, "keepalive":0, "default_enter":None, "response_return":None, "serial_settings": None, "fast_cli":False, "session_log":None, "session_log_record_writes":False, "session_log_file_mode":'wirte' }
#連接 net_connect = ConnectHandler(**cisco_881) #或者 net_connect = ConnectHandler(device_type='cisco_ios', ip='10.10.10.227', username='pyclass', password='password')
找出設備的prompt
prompt = net_connect.find_prompt()
print prompt #輸出 'pynet-rtr1#'
輸出命令
output = net_connect.send_command("show ip int brief") print output # 輸出 如下 Interface IP-Address OK? Method Status Protocol FastEthernet0 unassigned YES unset down down FastEthernet1 unassigned YES unset down down FastEthernet2 unassigned YES unset down down FastEthernet3 unassigned YES unset down down FastEthernet4 10.220.88.20 YES NVRAM up up Vlan1 unassigned YES unset down down
net_connect.send_command('clear configuration commits diskspace 2000', delay_factor=2) #給這條命令增加延時時間,2倍
查看設備配置
output = net_connect.send_command("show run | inc logging") #看下當前的日志配置 print output # 輸出 logging buffered 8880 no logging console
改變設備配置
config_commands = ['logging buffered 19999'] #創建一個想要執行的配置命令列表 output = net_connect.send_config_set(config_commands) #執行配置命令列表 print output #輸出結果 config term Enter configuration commands, one per line. End with CNTL/Z. pynet-rtr1(config)#logging buffered 19999 pynet-rtr1(config)#end pynet-rtr1# #查看設備配置是否改變 output = net_connect.send_command("show run | inc logging") print output #輸出 logging buffered 19999 no logging console
如果有跳板機的情況下
windows(script server)---Linux(jumper server)---Router
from netmiko import ConnectHandler import time from netmiko import redispatch jumpserver = { 'device_type':'termimal_server', #腳本在windows上跳板機的類型一般都是termila_server 'ip': '192.168.5.2', 'username':'xxx', 'password':'xxxx', } net_connect = ConnectHandler(**jumpserver) print net_connect.find_prompt() net_connect.write_channel("ssh xx@10.30.1.11\n") #連接遠程機器,必須得帶回車 time.sleep(3) #必須得等待幾秒,否則讀取不到返回 result = net_connect.read_channel() #讀取返回結果 if 'assword' in result: net_connect.write_channel("password\n") #輸入密碼 time.sleep(5) redispatch(net_connect, device_type='cisco_ios') # net_connect.send_command('show version') net_connect.disconnect()
send_command(command_string, expect_string=None,delay_factor=1, max_loops=500, auto_find_prompt=True,strip_prompt=True, strip_command=True, normalize=True, use_textfsm=False) expect_string #如果沒有值會把prompt作為expect string normalize #如果為True,則會把command_string給出的字符串去掉左空格在加上回車鍵 use_textfsm #如果為True
net_connect.config_mode() -- 進入配置模式
net_connect.check_config_mode() -- 檢查是否在配置模式中,返回布爾值
net_connect.exit_config_mode() -- 退出配置模式
net_connect.clear_buffer() -- 清除在遠程設備上輸出的緩存
net_connect.enable() -- 進入enable模式
net_connect.exit_enable_mode() -- 退出enable模式
net_connect.find_prompt() -- 返回當前設備的prompt
net_connect.commit(arguments) -- 執行一個提交動作在juniper和IOS-XR上
net_connect.disconnect() -- 關於ssh連接
net_connect.send_command(arguments) -- 發送命令,返回輸出結果,默認超時時間為self.timeout的設置時間,默認為8秒
net_connect.send_command_expect(arguments) #默認超時時間100秒
net_connect.send_command_timing(arguments)
net_connect.send_config_set(arguments) -- 發送一組配置命令給遠程設備
net_connect.send_config_from_file(arguments) -- 發送一組從本地寫好的文件中的配置命令