网络自动化运维教程 课件全套 项目1-12 Python编程基础-使用Nmap扫描网络_第1页
网络自动化运维教程 课件全套 项目1-12 Python编程基础-使用Nmap扫描网络_第2页
网络自动化运维教程 课件全套 项目1-12 Python编程基础-使用Nmap扫描网络_第3页
网络自动化运维教程 课件全套 项目1-12 Python编程基础-使用Nmap扫描网络_第4页
网络自动化运维教程 课件全套 项目1-12 Python编程基础-使用Nmap扫描网络_第5页
已阅读5页,还剩292页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目1Python编程基础Python编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理1.6网络模块1.7任务实施1.1Python简介Python是一种高级编程语言,由荷兰人GuidovanRossum于1989年圣诞节期间发明并首次发布。Python官网:Python的特点是易于学习、易于阅读、易于维护,并且具有良好的跨平台特性,能够在多个操作系统上运行,如

Windows、Linux、MacOS

等。它拥有丰富的标准库和第三方库,覆盖了广泛的领域需求。目前,Python的主要应用领域如下:1Python简介1.1Python简介2Python应用领域⑤自动化运维selenium⑥WEB开发Web框架如Django,web2py等⑦科学计算NumPy,SciPy,Matplotlib⑧常规软件开发软件开发、脚本编写、网络编程①人工智能机器学习、神经网络、深度学习②云计算开源云计算解决方案OpenStack③大数据数据分析、数据可视化、数据挖掘④网络爬虫主流爬虫设计语言,Scrapy框架Python应用场合Python编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理1.6网络模块1.7任务实施1.3Python函数所谓标识符就是变量、常量、函数、类等对象使用的名字。变量命名规则:名称第一字符为英文字母或者下划线名称第一字符后可以使用英文字母、下划线和数字名称不能使用python的关键字或保留字符名称区分大小写,单词与单词之间使用下划线连接1标识符1.2Python编程基础Python关键字,也叫保留字,是Python语言官方确定的用作语法功能的专用标识符,标识符不能与Python的关键字和内置函数的名字相同。关键字只包含小写字母。Python的标准库提供了一个keyword模块。2

关键字1.2Python编程基础在Python中,以符号”#“为单行注释的开始,从它往后到本行末尾的内容,都是注释。如果想注释多行语句,只能在每行的开头加上符号”#“。很多时候,在一些Python脚本文件的开头都能看到以“#“开头的两行代码,它们不是注释,而是一些设定。这两行代码的特点是位置在文件的顶行、顶左,没有空格和空行。3注释#!/usr/bin/python#-*-coding:UTF-8-*-第一行用于指定运行脚本的Python解释器,为Linux专用,Windows中不需要。第二行用于指定代码的编码方式。Python3全面支持Unicode,默认采用UTF-8编码,本行可以不需要。但在Python2中,通常都需要这一行。1.2Python编程基础Python最具特色的语法格式就是使用缩进来表示代码块,不像其他编程语言使用花括号或其他符号。相同层次的语句具有相同的缩进。Python缩进规则是指在定义类、函数、流程控制语句、异常处理语句等时,行尾的冒号和下一行的缩进表示下一个代码块的开始,而缩进的结束则表示代码块的结束。Python官方的代码规范PEP8建议使用4个空格作为缩进。如果缩进的空格数不一致,会抛出名为"IndentationError"的异常。4语句缩进1.2Python编程基础Python中通常一行就是一条语句,一条语句通常也不会超过一行。但Python并没有从语法层面完全禁止在一行中使用多条语句,可以使用分号实现多条语句在一行。若一条语句实在太长,也是可以占用多行的,可以使用反斜线来实现多行语句。如下面的字符串:4多行语句>>>importos;s="NetworkAutomatic";print(s)string="Thisbookispythonfornetworkengineers"\+"toworkfornetworkautomatic."1.2Python编程基础Python是一门弱类型语言,变量使用前无须声明,变量名可以看作对象的引用。Python中有许多内置的基本数据类型,分为数字(number)、字符串(string)、列表(list)、元组(tuple)、字典(dict)、集合(set)以及一些不太常用的数据类型,如字节串(byte)等。这些数据类型可以分成以下几种类型。(1)可变类型:列表(list)、字典(dict)和集合(set)。(2)不可变类型:数字(number)、字符串(string)和元组(tuple)。(3)序列类型:字符串(string)、列表(list)、元组(tuple)和字典(dict)。(4)非序列类型:集合(det)。5数据类型1.2Python编程基础Python是一门弱类型语言,流程控制指的是代码运行逻辑、分支走向、循环控制,是体现程序执行顺序的操作。流程控制结构一般分为顺序结构、选择结构和循环结构。

(1)顺序结构是程序逐行执行,所有语句都按照它们在文件中写入的顺序执行。

(2)选择结构也称分支结构,是指程序有选择地执行代码,可以跳过没用的代码,只执行有用的代码。通常有如下两种选择结构。条件判断:if/elif/else。异常处理:try/except

(3)循环结构是指程序不断地重复执行同一段代码。通常有如下两种循环结构:for循环。while循环5流程控制1.3Python函数Python是一门弱类型语言,流程控制指的是代码运行逻辑、分支走向、循环控制,是体现程序执行顺序的操作。流程控制结构一般分为顺序结构、选择结构和循环结构。

(1)顺序结构是程序逐行执行,所有语句都按照它们在文件中写入的顺序执行。

(2)选择结构也称分支结构,是指程序有选择地执行代码,可以跳过没用的代码,只执行有用的代码。通常有如下两种选择结构。条件判断:if/elif/else。异常处理:try/except

(3)循环结构是指程序不断地重复执行同一段代码。通常有如下两种循环结构:for循环。while循环6流程控制Python编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理1.6网络模块1.7任务实施1.3Python函数定义函数使用保关键def,def后跟函数名和圆括号,在圆括号内定义函数接收的参数,也可以不定义参数。圆括号后是冒号,函数体(函数的代码块)以冒号开始,并且统一缩进。使用return语句结束函数,默认返回None。return语句依然在函数体内部,不能回退缩进。直到函数的所有代码写完,才回退缩进,表示函数结束。函数定义语法如下:1函数定义def函数名(参数):#内部代码

return表达式1.3Python函数2函数调用函数只有在被调用时才会被执行。要调用函数,必须使用函数名后跟圆括号的方式。调用时要根据函数的定义,提供相应个数和类型的参数,每个参数之间用逗号分隔。在Python中,用def语句创建函数时,可以用return语句指定函数返回的值,返回值可以是任意类型的。需要注意的是,return语句在同一个函数中可以有多条,但只要有一条得到执行,就会直接结束函数。>>>defconfigure_intf(intf_name,ip,mask): config=f'interface{intf_name}\nipaddress{ip}{mask}' returnconfig>>>ret=configure_intf('Fa0/0','','')>>>print(ret)interfaceFa0/0ipaddressPython编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理2.6网络模块1.7任务实施1.4异常处理1

异常处理一个程序发生异常,代表该程序在执行时出现了非正常的情况,无法再执行下去。默认情况下,程序是要终止的。如果要避免程序退出,可以使用捕获异常的方式获取异常的名称,再通过其他的逻辑代码让程序继续运行,这种根据异常做出的逻辑处理称为异常处理。Python定义了3种异常处理结构:try/except结构;try/except/else结构;try/except/finally结构。1.4异常处理2try/except结构try/except结构的执行流程如下:首先执行try中的代码块,如果程序执行过程中出现异常,系统会自动生成一个异常类型,并将该异常提交给Python解释器,此过程被称为捕获异常。当Python解释器收到异常时,会寻找能处理该异常的except块,如果找到合适的except块,就把该异常交给该except块处理,此过程被称为处理异常。如果Python解释器找不到能处理异常的except块,则程序终止运行,Python解释器也将退出。try:

a=input("Enterfirstnumber:")

b=input("Entersecondnumber:")

print("Result:",int(a)/int(b))

exceptValueError:

print("Pleaseenteronlynumbers")

exceptZeroDivisionError:

print("Youcan'tdividebyzero")1.4异常处理3try/except/else结构try/except/else结构的执行流程如下:在try/except结构的基础上,Python

异常处理机制还提供了增加一个else块的结构,即try/except/else结构。当try块没有捕获到任何异常时,才会执行使用else包裹的代码。如果try块捕获到异常,只会执行except块中的代码处理异常,不会执行else包裹的代码。try:

a=input("Enterfirstnumber:")

b=input("Entersecondnumber:")

result=int(a)/int(b)

except(ValueError,ZeroDivisionError):

print("Somethingwentwrong...")

else:

print("Resultissquared:",result)1.4异常处理4try/except/finally结构try/except/finally结构的执行流程如下:Python

异常处理机制还提供了增加一个finally块的结构,即try/except/finally结构。在整个异常处理过程中,无论try块是否捕获到异常,最终都要进入finally块,并执行其中的代码。try:

a=input("Enterfirstnumber:")

b=input("Entersecondnumber:")

result=int(a)/int(b)

except(ValueError,ZeroDivisionError):

print("Somethingwentwrong...")

else:

print("Resultissquared:",result)

finally:

print("Andtheylivedhappilyeverafter.")Python编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理1.6网络模块1.7任务实施1.5文件处理Python

提供了内置的文件对象,以及用于对文件、目录进行操作的内置模块,通过这些可以很方便地将数据保存到文件中。在Windows上,书写路径时使用反斜””线作为路径分隔符,但在OSX和Linux上,使用正斜””线作为路径分隔符。r/R表示原始字符串。所有的字符串都是直接按照字面的意思来使用的,没有转义特殊或不能打印的字符。1文件路径>>>print("D:\python\\test\n")#字符串前不加r或RD:\python\test

>>>print(r"D:\python\test\n")#字符串前加r或R。输出的是原始字符串D:\python\test\n1.5文件处理Python

中文件操作有很多种,常见的操作是对文件进行读取和写入。文件必须在打开之后才能进行操作,在操作结束之后,还应该将其关闭。因此文件操作可以分为以下3步,每一步都需要借助对应的函数实现。打开文件:使用内置的open()函数,该函数会返回一个文件对象。对已打开的文件进行读/写操作:读取文件内容可使用read()、readline()以及readlines()函数;向文件中写入内容,可以使用write()函数。关闭文件:完成对文件的读/写操作之后,需要关闭文件,可以使用close()函数。2文件操作1.5文件处理在Python中,要操作文件,首先需要创建或者打开指定的文件,并创建文件对象,而这些工作可以通过内置的open()函数完成。3打开文件file=open('file_name.txt','r')模式作用说明r以只读模式打开文件

文件必须存在rb以二进制格式、只读模式打开文件,一般用于非文本文件,如图片文件、音频文件等w以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容文件存在,会清空;不存在,则创建文件wb以二进制格式、只写模式打开文件,一般用于非文本文件a以追加模式打开文件,如果文件已经存在,新写入内容会追加到已有内容之后;否则会创建新文件

a+以二进制格式打开文件,并采用追加模式,如果文件已存在,新写入内容会追加到已有内容之后;否则创建新文件。

1.5文件处理Python

提供了如下3种函数来实现读取文件中数据的操作。read()函数:逐个字节或者字符读取文件中的内容。readline()函数:逐行读取文件中的内容。readlines()函数:一次性读取文件中多行内容4文件读取>>>f=open('R1.txt','r')>>>f.readlines()#将文件中的每一行作为列表的一个元素['!\n','servicetimestampsdebugdatetimemseclocaltimeshow-timezoneyear\n','servicetimestampslogdatetimemseclocaltimeshow-timezoneyear\n','servicepassword-encryption\n','servicesequence-numbers\n','!\n','noipdomainlookup\n','!\n','ipsshversion2\n','!']>>>f.close()1.5文件处理写入文件时,指定正确的文件打开模式非常重要,以免误删。w打开文件进行写入。如果文件存在,则删除其内容。a打开文件以添加数据。数据添加到文件末尾。如果文件不存在,在两种模式下都会创建一个文件。以下函数用于写入文件。write():将一行内容写入文件writelines():允许将字符串列表作为参数发送5文件写入>>>f=open("R2.txt","w")#以w模式打开文件>>>cfg_lines_as_string='\n'.join(cfg_lines)#将列表用“\n”连接成字符串>>>f.write(cfg_lines_as_string)#将字符串写入文件231>>>f.close()>>>os.listdir()#列出文件列表['.idea','R1.txt','R2.txt']>>>

1.5文件处理文件操作时,一直强调打开的文件最后一定要关闭,否则会给程序的运行造成意想不到的隐患。但是,即便使用close()函数,如果在打开文件或文件操作过程中抛出了异常,还是无法及时关闭文件。为了更好地避免此类问题,Python提供了withas语句用来操作上下文管理器(contextmanager),它能够帮助我们自动分配并且释放资源,保证文件自动关闭。6关闭写入>>>withopen('R1.txt','r')asf:

forlineinf:

print(line)Python编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理1.6网络模块1.7任务实施1.6网络模块1ipaddress模块ipaddress模块包括IPv4和IPv6地址的类,可以用来生成、验证、查找IP地址。从Python3.3开始,ipaddress模块正式成为Python标准库中的模块之一,不需要安装,可直接使用。ipaddress模块中有IPv4Address

类和IPv6Address类可分别用来处理IPv4和IPv6地址。由于IPv4Address和IPv6Address对象共享许多共同属性,后面的案例将只处理IPv4地址,可以以类似的方式处理IPv6地址1.6网络模块1ipaddress模块ipaddress.ip_address()

函数会根据传入的字符串自动创建IPv4/IPv6Address对象使用ipaddress.ip_network()函数创建IPv4/IPv6Address对象>>>importipaddress>>>ipv4=ipaddress.ip_address("")>>>print(ipv4)>>>subnet1=ipaddress.ip_network("/24")#给定网段>>>subnet1.broadcast_address#获取网段的广播地址IPv4Address('55')>>>subnet1.with_netmask'/'#获取网段加子网掩码>>>subnet1.with_hostmask#获取网段加主机掩码'/55'>>>subnet1.prefixlen#获取掩码长度241.6网络模块1ipaddress模块使用ipaddress.ip_address()

创建IPv4Address对象有很多IPv4地址的属性:>>>ipv4.pressedipv4.is_loopbackipv4.is_unspecifiedipv4.versionipv4.explodedipv4.is_multicastipv4.max_prefixlenipv4.is_globalipv4.is_privateipv4.packedipv4.is_link_localipv4.is_reservedipv4.reverse_pointer1.6网络模块2netaddr模块netaddr模块是Python处理IP地址和MAC地址的开源第三方库,是用于对网络地址段进行定义和操作的一个工具。netaddr模块不是Python的标准模块,使用前需要安装.IPAddress对象表示单个IP地址,可以接收一个IPv4或IPv6地址字符串地址>>>fromnetaddrimportIPAddress#导入IPAddress类>>>ip=IPAddress("")#IPAddress类的对象>>>ipIPAddress('')>>>type(ip)#获取对象的类型<class'netaddr.ip.IPAddress'>>>>ip.version#查看ip对象是IPv4还是IPv64>>>ip.bits()#转成点分二进制'11000000.10101000.00000001.00000001'>>>ip.bin#将IP地址转成二进制的值'0b11000000101010000000000100000001'>>>ip.words#获取IP地址的4部分的值(192,168,1,1)1.6网络模块2netaddr模块IPNetwork()是处理IP网段的方法,同样可以接收一个IPv4或IPv6地址字符串>>>fromnetaddrimportIPNetwork>>>ip=IPNetwork("/24")>>>ipIPNetwork('/24')>>>ip.cidrIPNetwork('/24')>>>ip.hostmaskIPAddress('55')>>>workIPAddress('')>>>maskIPAddress('')>>>

1.6网络模块3tabulate模块通过tabulate模块可以精美地显示数据。tabulate模块不是Python的标准模块,使用前需要安装tabulate模块支持列表、字典等表格数据类型。模块中tabulate()函数用于制表。>>>fromtabulateimporttabulate#导入tabulate模块,并定义列表dis_ip_int_br>>>dis_ip_int_br=[("FastEthernet0/0","","up","up"),("FastEthernet0/1","","up","up"),("FastEthernet0/2","","up","up"),("Loopback0","","up","up"),("Loopback100","","up","up")]>>>

>>>print(tabulate(dis_ip_int_br))#使用tabulate()使输出相对整齐---------------------------FastEthernet0/0upupFastEthernet0/1upupFastEthernet0/2upupLoopback0upupLoopback100

upup---------------------------1.6网络模块3tabulate模块tabulate()函数还可以使用headers参数指定列名>>>columns=['Interface','IP','Status','Protocol']#定义列名>>>print(tabulate(dis_ip_int_br,headers=columns))#加上headers参数InterfaceIPStatusProtocol------------------------------------------FastEthernet0/0upupFastEthernet0/1upupFastEthernet0/2upupLoopback0

upupLoopback100

upup>>>

1.6网络模块3tabulate模块使用参数tablefmt输出网格>>>print(tabulate(dis_ip_int_br,headers=columns,tablefmt="grid"))+-----------------+-----------+----------+------------+|Interface|IP|Status|Protocol|+=================+===========+==========+|FastEthernet0/0||up|up|+-----------------+-----------+----------+------------+|FastEthernet0/1||up|up|+-----------------+-----------+----------+------------+|FastEthernet0/2||up|up|+-----------------+-----------+----------+------------+|Loopback0||up|up|+-----------------+-----------+----------+------------+|Loopback100||up|up|+-----------------+-----------+----------+------------+Python编程基础1.5文件处理1.1Python简介1.2Python编程基础1.3函数1.4异常处理1.6网络模块1.7任务实施1.7任务实施ping命令是运维工程师检查网络连通性的常用命令,作为运维工程师,基本上每天都会用到,它可以很好地帮助运维工程师分析和判定网络故障。但是ping命令每次只能ping一个IP地址,对于公司A中大量的网络设备,显然不能一个一个地ping。为此公司安排运维工程师小李使用Python编写一个批量ping的网络检查工具,该工具需要具备如下功能:可以批量pingIP地址;可以处理ping一段IP地址,如00-00,00-200;可以读取包含IP的TXT文件;打印出可以ping通和ping不通的IP地址1.7任务实施ping命令是运维工程师检查网络连通性的常用命令,作为运维工程师,基本上每天都会用到,它可以很好地帮助运维工程师分析和判定网络故障。但是ping命令每次只能ping一个IP地址,对于公司A中大量的网络设备,显然不能一个一个地ping。为此公司安排运维工程师小李使用Python编写一个批量ping的网络检查工具,该工具需要具备如下功能:可以批量pingIP地址;可以处理ping一段IP地址,如00-00,00-200;可以读取包含IP的TXT文件;打印出可以ping通和ping不通的IP地址项目2使用telnetlib下发网络配置项目2使用telnetlib下发网络配置2.1telnetlib模块对象与方法2.2telnetlib登录设备

2.3任务实施2.1telnetlib模块对象与方法telnetlib是Python标准库中的内置模块,无需额外安装。它提供了实现Telnet功能的类telnetlib.Telnet。telnetlib.Telnet类里的不同方法实现不同功能。Telnet

表示到Telnet服务器的连接.实例初始化后默认不连接;必须使用

open()

方法来建立连接。或者,可选参数host和port也可以传递给构造函数,在这种情况下,到服务器的连接将在构造函数返回前建立。可选参数

timeout

为阻塞操作(如连接尝试)指定一个以秒为单位的超时时间(如果没有指定,将使用全局默认设置)。1telnetlib模块介绍class

telnetlib.Telnet(host=None,

port=0[,

timeout])

1.1telnetlib模块对象与方法Telnet

实例有以下几种常用方法:2Telnet类对象及方法方法功能Telnet.read_until(expected,timeout=None)读取直到给定的字符串expected或超时秒数。Telnet.read_all()读取所有数据直到EOF(EndOfFile)。阻塞直到连接关闭。Telnet.read_very_eager()读取从上次IO阻断到现在所有的内容,返回字节串。连接关闭或者没有数据时触发EOFError异常。Telnet.write(buffer)写入数据。在套接字(Socket)上写一个字节串,加倍任何IAC(InterpretAsCommand)字符。Telnet.close()关闭连接。Telnet.open(host,

port=0[,

timeout])连接主机。第二个可选参数是端口号,默认为标准Telnet端口(23)Telnet.write(buffer)向套接字写入一个字节字符串Teract()交互函数,模拟一个命令行Telnet客户端。Telnet.expect(list,

timeout=None)一直读取,直到匹配列表中的某个正则表达式。项目2使用telnetlib下发网络配置2.1telnetlib模块对象与方法2.2telnetlib登录设备

2.3任务实施2.2telnetlib登录设备

现有一台网络设备S5700交换机作为Telnet服务器,需要实现使用Pythontelnetlib作为Telnet客户端登录此设备。在eNSP中搭建以下拓扑:通过Cloud1连接本地主机和S5700,安装华为eNSP模拟器后会自动在本地主机(Windows)上产生一个虚拟网卡:Cloud1的作用就是将本地主机通过这个虚拟网卡连接到交换机S5700。1telnetlib登录设备VirtualBoxHost-OnlyNetwork-IP:,即本地主机上的IP地址为:。2.2telnetlib登录设备

2telnetlib登录设备Cloud1的设置:2.2telnetlib登录设备

3telnetlib登录设备使用telnetlib登录S5700可为四个步骤:配置设备Telnet服务,使用密码方式。手动验证和查看Telnet登录步骤,作为代码实现的参考。编写和运行Python代码。验证结果。2.2telnetlib登录设备

4telnetlib登录设备:配置交换机[Huawei]user-interfacevty04[Huawei-ui-vty0-4]authentication-modepassword[Huawei-ui-vty0-4]setauthenticationpasswordsimpleHuawei@123[Huawei-ui-vty0-4]protocolinboundtelnet[Huawei-ui-vty0-4]userprivilegelevel15[Huawei-ui-vty0-4]quit[Huawei]telnetserverenable[Huawei]intfacevlanif1[Huawei-Vlanif1]ipaddress0024[Huawei-Vlanif1]quit[Huawei]interfaceGE0/0/1[Huawei-GE1/0/0]undoshutdown配置设备接口地址:配置设备Telnet服务:2.2telnetlib登录设备

5telnetlib登录设备:手工验证telnet交换机C:\Users\Administrator>telnet00LoginauthenticationPassword:Info:ThemaxnumberofVTYusersis5,andthenumberofcurrentVTYusersonlineis1.Thecurrentlogintimeis2020-01-1521:12:57.<Huawei>登录命令--

回显信息--输入密码--回显信息--2.2telnetlib登录设备

6telnetlib登录设备

–编码Python中encode()和decode()函数的作用是,以指定的方式编码格式编码字符串和解码字符串。password.encode(‘ascii‘)表示将字符串’Huawei@123’转为为ASCII。此处编码格式遵守telnetlib模块官方要求。Python字符串增加b,b’str‘表示这是字符串是bytes对象。b’Password:’表示将字符串’Password:’转换为bytes类型字符串。项目2使用telnetlib下发网络配置2.1telnetlib模块对象与方法2.2telnetlib登录设备

2.3任务实施2.3任务实施2.3任务实施整个网络已经部署和实现了路由、交换等各项功能,并实现了全网互通。本任务主要是向深圳总部园区网络和服务器区网络的路由器和交换机下发配置,工程师需要完成的任务如下。(1)手动在路由器SZ1和SZ2,交换机S1.、S2和S4上配置Telnet服务,Telnet登录用户名python,密码Huawei12#$。(2)使用telnetlib在所有路由器和交换机上配置运维用户,用户的安全级别为1,用户名yunwei_001,密码Huawei@123(3)手动配置ISP路由器作为NTP的朱时钟源,使用IP地址,配置路由器SZ2作为深圳总部园区网络和服务器区网络所有设备的NTP服务器,IP地址是,使用telnetlib在所有路由器和交换机下发NTP配置,与其进行时间同步。(4)使用telnetlib在所有路由器和交换机上配置SNMPv3,SNMPv3用户名为user01,所属组名为group01,鉴别方式为SHA,鉴别密码为Huawei@123,加密方式为AES128,加密密码为Huawei@123。项目3使用paramiko实现网络设备自动化巡检项目3使用paramiko实现网络设备自动化巡检3.1Paramiko模块介绍3.2Paramiko模块的类3.3任务实施3.1PythonParamiko模块SSH是一个是一种用于在不安全网络上进行安全远程登录和实现其他安全网络服务的协议,OpenSSH是其中一个开源实现。Paramiko是Python实现SSHv2协议的模块,它支持口令认证和公钥认证两种方式。可以实现安全的远程命令执行、文件传输等功能。Paramiko可以使用SSHv2远程连接到Linux服务器或网络设备,查看上面的日志状态,批量配置远程服务器或设备,文件上传,文件下载等1Paramiko模块-介绍3.1PythonParamiko模块Paramiko模块中有很多组件,可以归纳为:常用协议类和密钥相关类。常用协议类主要有以下组件:最常用的两个类为SSHClient类和SFTPClient类,分别提供SSH和SFTP功能。2Paramiko模块–组件Channel类:该类用于创建在SSHTransport上的安全通道。Message类:SSHMessage是字节流。该类对字符串、整数等进行编码。Packetizer类:数据包处理类。Transport类:该类用于在现有套接字或类套接字对象上创建一个Transport会话对象。SFTPClient类:该类通过一个打开的SSHTransport会话创建SFTP会话通道并执行远程文件操作。SSHClient类:该类是与SSH服务器会话的高级表示,集成了Transport,Channel和SFTPClient类。3.1PythonParamiko模块密钥相关类主要有以下组件:OpenSSH是SSH协议的免费开源实现。OpenSSH提供了服务端后台程序和客户端工具。所有的Linux操作系统均集成了OpenSSH。OpenSSH把用户访问过每个计算机的公钥都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,避免用户受到中间人攻击等。3Paramiko模块–组件SSHAgent类:该类用于SSH代理。Hostkeys类:该类与OpenSSHknown_hosts文件相关,用于创建一个hostkeys对象。Keyhandling类:该类用于创建对应密钥类型的实例,如RSA密钥,DSS(DSA)密钥。3.1PythonParamiko模块在Windows主机,打开Win10的命令行CMD,执行:pipinstallparamiko命令。建议使用国内pip源安装。测试paramiko,可以看出paramiko的版本为2.7.24Paramiko模块安装C:\Users\Administrator>pipinstallparamiko-i/pypi/simple/--trusted-hostC:\Users\Administrator>pythonPython3.9.6(tags/v3.9.6:db3ff76,Jun282021,15:26:21)[MSCv.192964bit(AMD64)]onwin32Type"help","copyright","credits"or"license"formoreinformation.>>>>>>importparamiko>>>paramiko.__version__'2.7.2'>>>>>>exit()C:\Users\Administrator>项目3使用paramiko实现网络设备自动化巡检3.1Paramiko模块介绍3.2Paramiko模块的类3.3Paramiko案例3.2

Paramiko模块的类SSHClient的作用类似于Linux的SSH命令,是对SSH会话的封装,该类封装了传输(Transport),通道(Channel)及SFTPClient类,通常用于执行远程命令。SSHClient常用方法如下:1SSHClient类及其方法connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。常用参数:Hostname:

连接的目标主机;

port:SSH_PORT指定端口

username:验证的用户名;

password:验证的用户密码

pkey:私钥方式用于身份验证;key_filename:一个文件名或文件列表,指定私钥文件

timeout:可选的tcp连接超时时间;compress:是否打开压缩

allow_agent:是否允许连接到ssh代理,默认为True允许

look_for_keys:是否在~/.ssh中搜索私钥文件,默认为True允许3.2

Paramiko模块的类2SSHClient类及其方法set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。load_system_host_keys():从系统文件加载主机密钥,如果没有参数,那么就尝试从用户本地的“knownhosts”文件中读取密钥信息。目前支持三种策略:AutoAddPolicy:自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认WarningPolicy用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接RejectPolicy自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项3.2

Paramiko模块的类3SSHClient类及其方法exec_command():在远程服务器执行Linux命令的方法。invoke_shell():基于SSH会话连接,启动一个交互式shell会话。open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作。如

sftp=client.open_sftp()

sftp.put('test.txt','text.txt')3.2

Paramiko模块的类SFTPCLient类作为一个sftp的客户端对象,根据SSH传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态。常用的方法:4SFTPClient类及其方法from_transport():从开启的Transport通道创建一个SFTP客户端通道。常用到的参数:

T:一个认证过的开启的Transport会话;window_size:可选参数,SFTP会话窗口大小max_packet_size:可选参数,SFTP会话最大数据包大小3.2

Paramiko模块的类5SFTPClient类及其方法get():将远程文件(remotepath)从SFTP服务器复制到本地主机的指定路径中(localpath),操作引发的任何异常都将被传递。put():将本地文件(localpath)从本地主机复制到SFTP服务器的指定路径中(remotepath),操作引发的任何异常都将被传递。mkdir()在服务器上创建目录remove()在服务器上删除目录rename()在服务器上重命名目录stat()查看服务器文件状态listdir()列出服务器目录下的文件3.2

Paramiko模块的类Keyhandling类用于创建对应密钥类型的实例,如RSA密钥,DSS(DSA)密钥。这个类包含了密钥的读取,写入等相关方法。常用方法:6Keyhandling类及其方法RSAKey.from_private_key_file(filename):从文件读取RSA私钥来创建密钥对象DSSKey.from_private_key_file(filename):从文件读取DSS私钥来创建密钥对象项目3使用paramiko实现网络设备自动化巡检3.1Paramiko模块介绍3.2Paramiko模块的类3.3Paramiko任务实施3.3使用Paramiko登录设备公司A的网络已经在正常运行。现在考虑对运行中的网络设备进行日常巡检,除了日常的设备环境检查外,还要检查设备基本信息和设备运行状态等。本任务将收集网络设备的版本信息、补丁信息、时钟信息、板卡运行状态、CPU使用率和内存使用率以及日志信息,便于分析网络运行状态。如图2-1所示,本任务只考虑深圳总部园区网络和服务器区网络,各设备的IP地址连接参见表2-3。按照公司的整体网络规划,运维工程师将对深圳总部园区网络和服务器区网络使用paramiko模块实现网络自动化巡检,需要完成的任务如下。

(1)配置并验证SSH服务端。

(2)使用paramiko登录设备。

(3)自动执行网络巡检的各项命令。项目4使用netmiko发现网络拓扑项目4使用netmiko发现网络拓扑4.1Netmiko模块介绍4.2Netmiko的方法4.3任务实施4.1Netmiko模块Paramiko实现了SSH2的功能,但它并不是专门为网设备开的模块。在用Paramiko和网络设备交互时并不很简单和通用。Netmiko基于Paramiko开发专门处理网络设备的SSH模块。这个模块目前能支持很多厂商设备SSH连接。1Netmiko模块-介绍4.1Netmiko模块Netmiko支持各种设备。这些设备分为三类,具体参阅链接:https://ktbyers.github.io/netmiko/PLATFORMS.html2Netmiko模块-介绍定期测试:在每次NetMiko发布之前,都会尝试对这组设备运行完整的测试套件。定期测试支持平台,如AristavEOS、CiscoASA、CiscoIOS、CiscoSG300、Linux(更多参阅链接网站);有限测试:有限的测试意味着配置和显示操作系统测试在某个时间点通过了该平台上的测试,因此,可以认为netmiko可以在这些平台是可以工作的。有限测试支持平台如下:HPEComware7、Huawei、IPInfusionOcNOS、JuniperScreenOS等(更多参阅链接网站)实验性:没有警告过定期测试和有限测试,但通过检查PR,应当是可以支持的,但是关于是否完全通过单元测试或其可靠性如何,没有足够的数据。实验室支持平台如下:A10、Accedian、Aruba、CienaSAOS、CheckPointGAiA(更多参阅链接网站)4.1Netmiko模块Netmiko基于Paramiko开发专门处理网络设备的SSH模块,是网络运维工程师日常工作中最常用的模块之一。相对Paramiko,Netmiko将很多细节优化和简化,如不需要导入time模块做休眠,输入每条命令不需要在后面加换行符\n,不需要执行system-view,quit等命令。方便提取、打印回显内容,还可以配合Jinja2模块调用配置模板,以及配合TextFSM、pyATS、Genie等模块将回显内容以有序的JSON格式输出,方便过滤和提取出所需的数据等3Netmiko模块–更容易使用4.1Netmiko模块在Windows主机,打开Win10的命令行CMD,执行:pipinstallnetmiko命令。建议使用国内pip源安装。测试netmiko,可以看出netmiko的版本为3.4.0

4netmiko模块安装C:\Users\Administrator>pipinstallnetmiko-i/pypi/simple/--trusted-hostC:\Users\Administrator>pythonPython3.9.6(tags/v3.9.6:db3ff76,Jun282021,15:26:21)[MSCv.192964bit(AMD64)]onwin32Type"help","copyright","credits"or"license"formoreinformation.>>>importnetmiko>>>netmiko.__version__'3.4.0'>>>exit()C:\Users\Administrator>项目4使用netmiko发现网络拓扑4.1Netmiko模块介绍4.2Netmiko的方法4.3Netmiko案例4.2Netmiko方法Netmiko的核心对象主要是ConnectHandler类。ConnetHandler()用来登录设备,包含几个必要的参数和可选参数,必要参数包括device_type,ip(或host),username和password,可选参数包括port,secret,use_keys,key_file,conn_timeout等。ConnetHandler()的参数有2中方式。一种是直接传入参数,一种是通过字典传入参数。注意,通过字典传入参数时要用2个星号。1Netmiko登录设备方法importnetmikonet_connect=netmiko.ConnectHandler(device_type="huawei",ip="00",username="python",password="Huawei12#$")importnetmikoSW1={"device_type":"huawei","ip":"00","username":"python","password":"Huawei12#$"}#注意:参数中上2个星号net_connect=netmiko.ConnectHandler(**SW1)4.2Netmiko方法Netmiko主要用到3个方法向设备做配置:send_command(),send_config_set()以及send_config_from_file();还有一个不太常用的send_command_timing():send_command()方法:2Netmiko配置设备方法send_command()只支持向设备发送一条命令,通常是`display`之类的查询、排错命令或者`save`这样保存配置的命令。发出命令后,这个函数默认情况下一直等待,直到接收到设备的完整回显内容为止。如果超时,则会返回一个**OSError**的异常。如果想要指定netmiko从回显内容中读到需要的内容,则需要用到expect_string参数(expect_string默认值为None),如果send_command()从回显内容中读到了expect_string参数指定的内容,则send_command()依然返回完整的回显内容,如果没读到expect_string参数指定的内容,则netmiko同样会返回一个OSError异常.4.2Netmiko方法send_config_set()方法:send_config_from_file()方法:3Netmiko配置设备方法send_config_set()向设备发送一条或多条配置命令,注意是配置命令,不是show/display之类的查询命令,send_config_set()本身会自动加上一个system-view命令进入配置模式(以及在命令末尾自动加上一个return命令)。send_config_set()一般配合列表使用。send_config_from_file()在配置命令数量较多的时候,可以先将所有的配置命令写入一个配置文件中,然后使用该方法去读取文件的内容完成配置。send_config_from_file()也会自动添加system-view和return两个命令,在配置文件里无需加入这两个命令。项目4使用netmiko发现网络拓扑4.1Netmiko模块介绍4.2Netmiko的方法4.3任务实施4.3任务实施按照公司的整体网络规划,运维工程师将对深圳总部园区网络和服务器区网络使用netmiko模块实现自动网络拓扑的发现,需要完成的任务如下。

(1)配置并验证设备SSH服务。

(2)配置设备LLDP功能。

(3)编写Python脚本。

(4)运行Python脚本。

(5)查看拓扑图。项目5使用PySNMP获取网络数据项目5使用PySNMP获取网络数据5.1SNMP介绍5.2PySNMP的方法5.3任务实施5.1SNMP介绍随着网络规模越来越庞大,网络中不同种类、不同厂家、不同型号设备共存,网络管理繁琐低效。为解决这个问题,SNMP(SimpleNetworkManagementProtocol,简单网络管理协议)应运而生,规范了网络管理的接口和协议,实现对网络中所有设备的统一管理。为应对网络中复杂多变的运维需求,工程师有必要具备代码编程能力以提高运维效率。Python中的PySNMP模块可以实现SNMP功能,是工程师提升运维能力的有力工具。1SNMP概述5.1SNMP介绍互联网工程任务组(IETF,InternetEngineeringTaskForce)定义了SNMP(简单网络管理协议),以此实现设备统一管理。所有支持SNMP协议的网络设备,都可将其统一纳入管理。2SNMP概述5.1SNMP介绍SNMP的发展经历了SNMPv1,SNMPv2c,SNMPv3,这是一个不断完善改进的过程。3SNMP概述SNMPv1协议SNMP的最初版本,容易实现且成本低。缺少大量读取数据的能力,没有足够的安全机制。适合规模较小,设备较少,安全性要求不高或本身就比较安全的网络,如校园网,小型企业网。SNMPv2扩充了SNMPv1的功能,增加GetBulk和inform操作。没有足够的安全机制。适合规模较大,设备较多,安全性要求不高或本身就比较安全,但业务比较繁忙,有可能发生流量拥塞的网络。SNMPv3增加了身份验证和加密处理。新的SNMP体系结构,适应性强、方便管理、扩展性好。适合各种规模,尤其是对安全性要求较高,只有合法的管理员才能对设备进行管理的网络。5.1SNMP介绍NMS(NetworkManagementSystem):采用SNMP协议对网络设备进行管理的系统。Agent:被管理设备中的一个代理进程,与NMS进行交互。MIB(Managementinformationbase):被管理设备所维护的变量(能够被Agent查询和设置的信息)构成的数据库。Managementobject:被管理对象,如设备中的某个硬件(如接口板),也可以是在硬件或软件上配置的参数集合。Device:被管理设备。4SNMP原理5.1SNMP介绍MIB是一个数据库,指明了被管理设备所维护的变量(即能够被Agent查询和设置的信息)。MIB在数据库中定义了被管理设备的一系列属性:对象标识符(ObjectIDentifier,OID)对象的状态对象的访问权限对象的数据类型等MIB给出了一个数据结构,包含了网络中所有可能的被管理对象的集合。因为数据结构与树相似,MIB又被称为对象命名树。5SNMP原理-MIB5.1SNMP介绍NMS通过SNMPv3向被管理设备下发查询和设置操作指令,并接收操作响应信息,同时监听被管理设备发送的告警信息。6SNMP原理–基本操作5.1SNMP介绍SNMP在执行Get、Set等基本操作时面临安全威胁,SNMPv3版本较v1,v2c在安全性方面做了提升。SNMPv1\v2c使用团体名进行安全认证。存在以下安全风险:大多数网络产品出厂时设定只读团体名缺省值为“Public”,读写操作团体名缺省值为“Private”。许多网络管理人员从未修改过该默认值。团体名在网络中明文传输,易泄露。SNMPv3安全性增强:7SNMP原理–安全性基本概念:用户组(Group):拥有特定安全级别属性的一个用户集合。安全级别:1级:privacy(鉴权且加密)2级:authentication(只鉴权)3级:noauthentication(不鉴权不加密)视图(View):允许用户访问的mib节点集合。用户安全模块USM(User-basedSecurityModel):身份验证:Agent或NMS接到信息时首先必须确认信息是否来自有权限的NMS或Agent,并且信息在传输过程中未被改变。数据加密:通过对称密钥系统,NMS和Agent共享同一密钥对数据进行加密和解密。基于视图的访问控制模块VACM:对用户组实现基于视图的访问控制5.1SNMP介绍如下拓扑,配置路由器AR18SNMP原理–被管理设备配置<Huawei>system-viewEntersystemview,returnuserviewwithCtrl+Z.[Huawei]sysnameR1[R1]intg0/0/1[R1-GigabitEthernet0/0/1]ipaddress0024[R1-GigabitEthernet0/0/1]quit接口配置5.1SNMP介绍配置路由器SNMP9SNMP原理–被管理设备配置#使能SNMP功能,配置版本为v3[R1]snmp-agent[R1]snmp-agentsys-infoversionv3#配置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论