首页 文章 精选 留言 我的

精选列表

搜索[自动化工具],共10000篇文章
优秀的个人博客,低调大师

【NetDevOps】paramiko - 自动化备份华为设备配置文件

拓扑图 前置工作 路由器、交换机基础配置 1.交换机、路由器配置ssh server 用户名:admin 密码:admin123 2.PC上安装python3, 并使用pip安装paramiko模块 pip3 install paramiko PC上运行ftp服务器;这里使用centos7,运行vsftpd服务,ip地址为192.168.164.133 。 1. 安装vsftpd服务 yum install -y vsftpd 2. 启动vsftpd服务 systemctl start vsftpd 服务开启后,进行连接测试,使用本地用户admin进行连接 语法:ftp 192.168.164.133 在交换机上查看配置文件信息 命令:dirvrpcfg.zip 文件就是我们需要的配置文件 手动上传配置文件测试 先登录到ftp服务器使用put命令上传配置文件,语法:put vrpcfg.zip 在centos7查看,配置文件接收情况可以修改文件名和存放目录,后面我们在脚本里做这个工作。 脚本 在Linux中创建脚本paramiko_ftp.py ,将ip地址信息写在 iphost.txt 文件中,放在脚本同目录 import paramiko import time import getpass import os #输入SSH登录信息 username=input('user:') password=getpass.getpass('password:') #打开ip列表文件 iphost=open('iphost.txt','r') #创建两个空列表,用于后面存放出现连接超时错误和登录信息错误的设备信息 timeout_list=[] auth_error_list=[] #检查以当前日期命名的文件夹是否存在,不存在就创建 Day = time.strftime('%Y-%m-%d',time.gmtime()) if os.path.exists('/home/admin/'+str(Day)+'/') is not True: os.mkdir('/home/admin/'+str(Day)+'/') #用for循环读取ip列表 for line in iphost.readlines(): #去除头尾的空格、换行符 ip=line.strip() #try内写正常执行的语句 try: #调用paramiko的SSHClient()方法,赋予变量ssh ssh=paramiko.SSHClient() #自动接受来自未保存主机的密钥 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #调用connect()方法进行ssh登录 ssh.connect(hostname=ip,username=username,password=password) #打印连接成功信息 print('已连接'+ip) #调用paramiko.SSHClient()的connect()方法,唤醒shell,赋值给变量command command=ssh.invoke_shell() #调用invoke_shell()的send()函数,向设备发送指令 command.send('ftp 192.168.164.133 \n') command.send('admin\n') #这里是ftp用户名,注意末尾不要有空格 command.send('admin\n') #ftp的密码,用的是linux的本地用户登录信息 time.sleep(2) #休眠2s,等待ftp连接 command.send('put vrpcfg.zip \n') #put命令,上传配置文件 command.send('quit \n') #修改配置文件在Linux的保存目录和文件名 os.rename(src='/home/admin/vrpcfg.zip',dst='/home/admin/'+str(Day)+'/'+'hw'+str(ip[8:])+'-vrpcfg.zip') #调用time模块sleep()函数,手动休眠1s,目的是等待设备回显内容输出,方便后面打印完整回显内容 time.sleep(1) #调用invoke_shell()的recv()函数,截取回显结果,一次最多65535字符 output=command.recv(65535) #打印回显结果,用utf-8解码 print(output.decode('utf-8')) #错误类型一,账号密码认证失败;打印并在列表中增加连接失败的ip地址 except paramiko.ssh_exception.AuthenticationException: print('认证失败',ip) auth_error_list.append(ip) #错误类型二,连接超时;打印并在列表中增加连接失败的ip地址 except TimeoutError: print('连接超时',ip) timeout_list.append(ip) #关闭ip列表文件 iphost.close() #调用paramiko.SSHClient()的close方法,退出ssh连接 ssh.close #如果列表不为空,打印出来连接失败的设备 if timeout_list: print('以下设备连接超时:') for i in timeout_list: print(i) if auth_error_list: print('以下设备认证失败:') for i in auth_error_list: print(i) 运行脚本python3 paramiko_ftp.py Linux终端 上传成功的回显信息示例在Linux上检查配置文件保存情况后续可以用 crontab -e 命令,添加定时任务,定时自动备份文件 参考:书籍: 网络工程师python之路知乎专栏: 弈心 - 网路行者

优秀的个人博客,低调大师

连载|想用Python做自动化测试?Python函数入门

“函数是 Python 程序中不可或缺的一部分,它是的程序模块化、清晰化。Python的很多功能都是通过内置函数提供的,比如 sorted() 表示对一个集合序列排序,len() 表示返回一个集合序列的长度大小等等。这节课,我们主要来学习 Python 的自定义函数。” 10.1 定义函数 使用def关键字 函数可以有返回值也可以没有返回值 # content of test_sample.pydef inc(x): # 有返回值 return x + 1def test_answer(): # 没有返回值 assert inc(3) == 5 10.2 调用函数 add_one=inc(3) 函数被调用时,这个函数此前必须定义过 10.3 函数的参数 10.3.1 位置参数 def divmod(x, y): # known case of builtins.divmod """ Return the tuple (x//y, x%y). Invariant: div*y + mod == x. """ return (0, 0) 这是一个Python内置的获得商和余数的函数。这个函数有两个参数:x和y,这两个参数都是位置参数,调用这个函数时,要按照顺序传入的两个实参值,实参值会依次赋给参数x和y。 10.3.2 默认值参数 def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): pass 这是Python内置的打开文件的函数,调用open打开文件时,可以只传递file文件路径,其他的参数可以不传递实参值,因为其他的参数都具有默认值。mode是打开文件的模式,默认值是r,表示以读的方式打开文件,默认值参数必须指向不可变对象。 不要这样: def add_end(li=[]): pass 要这样: def add_end(li=None): pass 10.3.3 变长参数 可以给函数一次性传递多个参数,或者传递一个列表或元组。定义函数时在参数名前加一个星号*。 def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum 函数calc的功能是求任意多个参数的平方和。函数定义时,在参数名加一个星号*。这样的函数,在调用时,可以传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。实际例子如下: calc(1, 2,3,4)calc(1, 2)calc()nums = [1, 2, 3]calc(*nums) # 还可以传递列表或者元组等进去 max是python内置的求最大值的函数。它的定义如下: def max(*args, key=None): # known special case of max """ max(iterable, *[, default=obj, key=func]) -> value max(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its biggest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the largest argument. """ pass 第一个参数是一个变长参数,上面举了两个例子,第一个参数可以是可迭代对象,也可以是多个参数。返回值是多个参数中的最大值,或者可迭代对象中的最大值。比如: print(max(1, 2, 3, 4, -9, -5)) # 多个参数print(max([1,2,3,4,-9,-5]))#可迭代对象,这里是一个列表 max函数还有一个默认值参数key,接受一个函数名,这时max函数返回的值是,将args参数分别用到key函数后的结果中的最大值。比如,找出一个数字列表中绝对值最大的元素: max([1, 2, 3, 4, -9, -5], key=abs) 10.3.4 关键字参数 下面这个sorted函数是Python内置的排序函数,它的第一参数是一个变长参数,第二个参数是个关键字参数,关键字参数是以两个星号开头。 def sorted(*args, **kwargs): # real signature unknown """ Return a new list containing all items from the iterable in ascending order. A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order. """ pass sorted函数默认是升序排序的,可以传入一个关键字参数reverse进行降序排序。方式是: print(sorted([1, 2, 3, 4, -9, -5], reverse=True)) 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个字典。 再来自定义一个: def person(name, age, **kwargs): print(name,age,kwargs) 关键字参数可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。传递关键字参数有两种方式: 传入字典 extra = {'city': 'Beijing', 'job': 'Engineer'}person('Jack', 24, **extra) # 字典参数名签名放两个** 直接传入key=value person('Jack', 24, salary=10000, department='finace') 10.3.5 参数组合 定义函数时,参数顺序必须是:位置参数、默认参数、变长参数、关键字参数。定义顺序不能乱。 def f1(a, b, c=0, *args, **kw): pass 10.4 看懂Python源码中函数的定义 有些朋友平时反映,看不懂官方文档中介绍函数的说明,比如查看min的源码: def min(*args, key=None): # known special case of min """ min(iterable, *[, default=obj, key=func]) -> value min(arg1, arg2, *args, *[, key=func]) -> value With a single iterable argument, return its smallest item. The default keyword-only argument specifies an object to return if the provided iterable is empty. With two or more arguments, return the smallest argument. """ pass min 函数的源码文档中,举了两个例子,其中的形参有 * 符号,又有 []?他们都表示啥意思呢? 函数形参列表中符号 * 表示,后面的形参只能为关键字参数,不能为位置参数,[]里面的参数是可选的,不是必填的,例如传递一个key参数和default参数时,必须写明参数名: >>> a = [1,2,3,4,2,2,3,4] >>> min(a,key=lambda x: a.count(x), default=1) # 求出个数最少的元素1 因为default是可选的,因此还可以这样: >>> list=[1,2,5,9,4,6,3]>>> min(list,key=lambda x:-x) # 取反后最小的值9 再来看一个min函数的用法,求一段文本中出现次数最少的字母。 import stringdef maxcharactor(content): content = content.lower() return min(string.ascii_lowercase, key=content.count)if __name__ == '__main__': print(maxcharactor("/Users/chunming.liu/learn/learn_python_by_coding/learn_string/")) 平时大家更多看到的是这么使用 min 函数,没有key参数: min([1,2,3,4,2,2,3]) 这是因为在min函数说明中,key参数是放在[] 中的,说明它是可选的,可以不传递。 自定义一个函数 func,参数 b 位于 * 后面,只能为关键字参数: def func(a,*,b): passfunc(a,b=1)f(a,1) # 这种调用是错误的TypeError: f() takes 1 positional argument but 2 were given 再看一个内置函数 sum: sum(iterable, start=0, /) Return the sum of a 'start' value (default: 0) plus an iterable of numbers When the iterable is empty, return the start value. This function is intended specifically for use with numeric values and may reject non-numeric types. 看到形参列表中有一个/,它表示/前的参数只能是位置参数,不能是关键字参数。 因此,以下调用是合法的: a = [1,3,2,1,4,2]sum(a,2) # start=2 表示求和的初始值为 215 以下调用是非法的,iterable 参数不能被赋值为关键字实参: sum(iterable=a,start=2)TypeError: sum() takes no keyword arguments 以后再查看Python中函数用法时,应该可以看懂了吧。 10.5 偏函数functools.partial Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。 先来看下Python官方的描述: # content of _functools.pyclass partial(object): """ partial(func, *args, **keywords) - new function with partial application of the given arguments and keywords. """ pass 翻译过来就是,functools.partial可以给一个函数设置位置参数和关键字参数的默认值,并且返回一个新的可调用对象。之后调用这个新的可调用对象时,就自动带上了functools.partial设置的默认参数值,从而可以传递更少的参数。举个例子: from functools import partialdef add(a, b, *arg, **kwargs): return a + b, arg, kwargsadd10 = partial(add, 10, kw1=1) # 设置add函数的位置参数a的默认值为10,关键词参数kwargs中的参数kw1的默认值是1,并返回新的可调用对象add10print(add10(11, 12)) # 调用新的函数对象add10,只需要在传递add函数的变量b的值就可以了 用Pycharm调试上面的代码,在add函数的return语句处添加断点,可以看到add10这个对象中args属性里面有一个10,kwwargs里面有一个"kw"=1,这就是通过partial偏函数设置进去的。 当调用add10时,只需要提供变量b=11和arg的值12,add10就能够将其与偏函数设置的值一起传递给原函数add了。 本文分享自微信公众号 - 明说软件测试(liuchunmingnet)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Python办公自动化之从Word到Excel

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 大家好,今天有一个公务员的小伙伴委托我给他帮个忙,大概是有这样一份Word(由于涉及文件私密所以文中的具体内容已做修改) 一共有近2600条类似格式的表格细栏,每个栏目包括的信息有: 日期发文单位文号标题签收栏需要提取其中加粗的这三项内容到Excel表格中存储,表格样式如下: 也就是需要将收文时间、文件标题、文号填到指定位置,同时需要将时间修改为标准格式,如果是完全手动复制和修改时间,依照一个条目10s的时间计算,一分钟可以完成6条,那么最快也需要: 而这类格式规整的文件整理非常适合用Python来执行,好的那么接下来请Python出场,必要的信息我在代码中以注释信息呈现。 首先使用Python将Word文件导入 # 导入需要的库docx from docx import Document # 指定文件存放的路径 path = r'C:\Users\word.docx' # 读取文件 document = Document(path) # 读取word中的所有表格 tables = document.tables 再把问题逐个划分,首先尝试获取第一张表第一个文件条目的三个所需信息 # 获取第一张表 table0 = tables[0] 仔细观察可以发现一个文件条目占据了3行,所以对表格全部行循环迭代时可以设步长为3 注意观察表格,按照row和cell把所需内容解析清楚 # 在全局放一个变量用来计数填序号 n = 0 for i in range(0, len(table0.rows) + 1, 3): # 日期 date = table0.cell(i, 1).text # 标题 title = table0.cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() print(n, date, tite, dfn) 接下来需要解决的是,时间我们获取的是 2/1 这种 日/月的形式。我们需要转化成 YYYY-MM-DD格式,而这利用到datetime包的strptime和strftime函数: strptime: 解析字符串中蕴含的时间strftime: 转化成所需的时间格式 import datetime n = 0 for i in range(0, len(table0.rows) + 1, 3): # 日期 date = table0.cell(i, 1).text # 有的条目时间是空的,这里不做过多判别 if '/' in date: date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d') else: date = '-' # 标题 title = table0.cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() print(n, date, tite, dfn) 这样一张表的内容解析就完成了,注意这里用的是table[0]即第一张表,遍历所有的表加一个嵌套循环就可以,另外也可以捕获异常增加程序灵活性 n = 0 for j in range(len(tables)): for i in range(0, len(tables[j].rows)+1, 3): try: # 日期 date = tables[j].cell(i, 1).text if '/' in date: date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d') else: date = '-' # 标题 title = tables[j].cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() n += 1 print(n, date, title, dfn) except Exception as error: # 捕获异常,也可以用log写到日志里方便查看和管理 print(error) continue 信息解析和获取完成就可以导出了,用到的包是openpyxl from openpyxl import Workbook # 实例化 wb = Workbook() # 获取当前sheet sheet = wb.active # 设立表头 header = ['序号', '收文时间', '办文编号', '文件标题', '文号', '备注'] sheet.append(header) 在最内层解析循环的末尾加上如下代码即可 row = [n, date, ' ', title, dfn, ' '] sheet.append(row) 线程的最后记得保存 wb.save(r'C:\Users\20200420.xlsx') 运行时间在10分钟左右,大概离开了一会程序就执行结束了 最后附上完整代码,代码很简单,理清思路最重要 from docx import Document import datetime from openpyxl import Workbook wb = Workbook() sheet = wb.active header = ['序号', '收文时间', '办文编号', '文件标题', '文号', '备注'] sheet.append(header) path = r'C:\Users\word.docx' document = Document(path) tables = document.tables n = 0 for j in range(len(tables)): for i in range(0, len(tables[j].rows)+1, 3): try: # 日期 date = tables[j].cell(i, 1).text if '/' in date: date = datetime.datetime.strptime(date, '%d/%m').strftime('2020-%m-%d') else: date = '-' # 标题 title = tables[j].cell(i + 1, 1).text.strip() # 文号 dfn = tables[j].cell(i, 3).text.strip() n += 1 print(n, date, title, dfn) row = [n, date, ' ', title, dfn, ' '] sheet.append(row) except Exception as error: # 捕获异常,也可以用log写到日志里方便查看和管理 print(error) continue wb.save(r'C:\Users\20200420.xlsx') 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-04-21本文作者:陈熹本文来自:“51CTO”,了解相关信息可以关注“51CTO”

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册