Python对FTP交互封装的实现
作者:白舟的博客 发布时间:2023-05-18 15:12:14
使用工具:
pexpect库
pexpect可以理解为Linux下expect(不知道的可以百度下linux expect)的python封装。
通过pexpect可以实现对ssh、ftp、passwd、telnet等命令进行自动交互,而无需人工干涉来达到自动化的目的。
比如我们可以模拟一个FTP登录时的所有交互,包括输入主机地址、用户名、密码,还有对文件上传下载操作等等,若出现异常,我们也可以进行自动化处理。
ftp登录脚本
实现登录,文件上传下载
import pexpect
class FTP(object):
def __init__(self,ip:str,user,passwd) : #初始化这些函数
self.ip = ip
self.user=user
self.passwd = passwd
self.child = None
def ftp_open(self):
self.child = pexpect.spawnu(f'10.0.0.1')
# print({self.ip})
self.child.expect(f'username')
self.child.sendline(f'username')
self.child.expect('(?i)password')
self.child.sendline(f'password')
self.child.expect('ftp> ',timeout=60)
def ftp_up_down(self):
self.child.sendline('put /tmp/test.dat /pub/test002.dat')
self.child.expect('ftp> ',timeout=60)
self.child.sendline('get /pub/test002.dat /tmp/test003.dat')
self.child.expect('ftp> ',timeout=60)
def ftp_up_down_port(self):
self.child.sendline('passive')
self.child.expect('ftp> ',timeout=60)
self.child.sendline('put /tmp/test.dat pub/test002.dat')
self.child.expect('ftp> ',timeout=60)
self.child.sendline('get /pub/test002.dat /tmp/test003.dat')
self.child.expect('ftp> ',timeout=60)
def ftp_close(self):
self.child.sendline('bye')
该方法实现封装的好处:
1.将登录上传下载退出分为不同方法,方便调用
2.传参灵活,可以任意增加或修改函数
pexpect组件简介
1. spawn类
spanw是pexpect的主要接口,功能就是启动和控制子应用程序,spawn()中可以是系统中的命令,但是不会解析shell命令中的元字符,包括重定向“>”,管道符“|”或者通配符“*”,但是我们可以将含有这三个特殊元字符的命令作为/bin/bash的参数进行调用,例如:
she = pexpect.spawn(‘/bin/bash –c “cat /etc/passwd | grep root > log.txt”')
she.expect(pexpect.EOF)
spawn支持使用python列表来代替参数项,比如上述命令可变为:
command = ‘cat /etc/passwd | grep root > log.txt'
she = pexpect.spawn(‘/bin/bash',[‘-c',command])
she.expect(pexpect.EOF)
(1)expect方法:expect定义了子程序输出的匹配规则。也可使用列表进行匹配,返回值是一个下标值,如果列表中有多个元素被匹配,则返回的是最先出现的字符的下标值。
(2)read方法:向子程序发送响应命令,可以理解为代替了我们的键盘输入。
send(self,s) 发送命令,不回车
sendline(self,s='') 发送命令,回车
sendcontrol(self,char) 发送控制字符test.sendcontrol(‘c')等价于“ctrl+c”
sendeof() 发送eof
2. run函数
run是使用pexpect进行封装的调用外部命令的函数,类似于os.system()或os.popen()方法,不同的是,使用run可以同时获得命令的输出结果及其命令的退出状态。
pexpect.run('ssh xxx@x.x.x.x',events={'password:':'xxx'})
events是个字典
来源:https://blog.csdn.net/qq_45175681/article/details/124165543
猜你喜欢
- 今天网页调试的时候在线订单出现错误:Server 对象 错误 'ASP 0178
- sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 s
- 导读:最近数据库经常出现会话阻塞的报警,过一会又会自动消失,昨天晚上恰好发生了一次,于是赶紧进行了查看,不看不知道,一看吓一跳,发现是由da
- 本文实例讲述了PHP实现将MySQL重复ID二维数组重组为三维数组的方法。分享给大家供大家参考,具体如下:应用场景MYSQL在使用关联查询时
- 1、二维数组声明方式是下面这样的:var images=new Array(); //先声明一维 for(var i=0;i<10;i
- 下面这段代码,你知道有哪些错误吗:var g_bar = "bar";function foo(container, c
- 一个日期联动选择器javascript源码,年月日联动显示,准确显示日期(包括闰年日期),可自定义日期范围。 【select】 先说清空一个
- 环境python版本号系统游览器python 3.7.2win7google chrome关于本文本文将会通过爬虫的方式实现简单的百度翻译。
- 1. 序言每年淘宝双十一的时候,总是要刷各种各样的浏览页面,收集能量或者喵币或者什么。那既然如此,我就总想着,能否通过Python自动调用的
- 本文实例讲述了PHP实现的curl批量请求操作。分享给大家供大家参考,具体如下:<?php$ch = array();$res = a
- 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:存放到数据列中的数据类型。数据值
- 如下:counter.htm<a href=counter.asp?save=123&url=http://127.0.0
- 应用场景1.需要将大型MP3文件切割成较小的部分以便上传或发送。2.需要从MP3文件中提取特定的音频片段,以便用于其他目的。3.需要快速制作
- 本文实例讲述了Centos7.4环境安装lamp-php7.0的方法。分享给大家供大家参考,具体如下:一. 环境准备桥接模式能访问外网#pi
- 阅读前:Pro Javascript Techniques翻译连载说明和目录JavaScript的演化是渐进而稳固的。历经过去十年的进程,J
- 浏览器对于CSS的支持问题落后于CSS的发展,以占有市场绝对份额的Internet Explorer来说,直到其前不久发布的第8个版本才刚刚
- 第一次做完主从库同步后正常,但工作过程中发现有一个库的数据库没有同步起来,在另外一个mysql(3307)中于是:1、在主库中创建一个临时库
- CSS hack是指我们为了兼容各浏览器,而使用的特别的css定义技巧。这是国外摘来的一张CSS hack列表,显示了各浏览器对css ha
- 防止Application对象在多线程访问中出现错误asp代码处理代码如下(VB):<%Application.Lock()Appli
- 在默认情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE