当前位置:首页 » 编程语言 » pythonexpect

pythonexpect

发布时间: 2023-09-03 07:35:59

1. pexpect 跨平台(WIN、LINUX)简明教程

详细的内容可以参考下面的参考文档,下面的内容主要是为网络设备运维人员使用的pexpect 跨平台简明教程。

Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。
pexpect是 Don Libes 的 Expect 语言的一个 python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。它可以用来实现与ssh, ftp, telnet等程序的自动交互。

send命令后执行结果内容保存在buffer中,这时child.expect('keyword')后,child.before即为“keyword”之前的字符串,child.after即为匹配的”keyword”字符串。
command的执行结果都保存在一个buffer中,每次执行expect时都从buffer中开始检查匹配的pattern,如果找到了匹配的pattern,则所有在匹配处之前的内容都从buffer中清除。
(这边没有看明白也没有关系,可以看后面的实践篇例子)

通常维护人员有的偏向于用WIN系统,有的偏向于LINUX系统。所以前期团队希望形成一个统一框架的时候就出现了一个难题。框架如何适用于不同的系统。
LInux系统pexpect包,win系统前期尝试使用winpexpect,但是程序改动很大,并没有调试成功。
如何在WIN系统使用python的pexpect包很难找到相关资料,某乎上都是类似的疑问没有解答。
团队成员增加后,终于有了新的思路 , 团结就是力量 。

通过这个模块进行不同系统的适配。
将plink.exe装在python的文件夹在python的安装目录下,win系统可以同样使用pexpect模块

参考信息1:Pexpect 官方文档 New in version 4.0: Windows support。Pexpect can be used on Windows to wait for a pattern to be proced by a child process, using [ pexpect.popen_spawn.PopenSpawn ]
参考信息2:PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。plink是可以独立使用的exe实现形式,可以让我们直接在命令行制定好命令,然后执行,完成后自动关闭session。ssh是一个安全通道协议。plink是这个通道协议的一个实现 [图片上传中...(-572001-1587612890428-0)]

从官方文档来看,
sendline() 和 send() 唯一的区别就是在发送的字符串后面加上了回车换行符,这也使它们用在了不同的地方:
只需要发送字符就可以的话用send()
如果发送字符后还要回车的话,就用 sendline()
但是在调测过程中,WIN系统下命令输入后,child.before始终得不到预想中的结果。
经过逐步排查,发现在WIN系统下只能使用send() ,如果使用sendline() ,第一次交互没有问题,后续交互就开始问题。

WIN系统下child.before输出为b'byte型,做判断时要转为str型。具体可以参考最后面一篇讲编码类型的文章,讲的很详细。

例子1

send Username后,child.before一直到'Tac_Userna',child.after为‘me:’,child.buffer为空。

expect关键字assword:后,child.before回显一直到keyword之前,child.after为keyword,child.buffer为空。

例子2

下发command命令,child.before维持原来的不变,expect到keyword以后,child.before变为下发command命令后的设备回显。

参考文档

官方文档

探索Pexpect

Pexpect示例及使用Tips

Python Pexpect模块讲解

Pexpect模块使用说明

windows下使用plink实现全自动登陆ssh

Python3_字符编码

2. 怎样用python实现scp

scp 功能很强大,但需要人工输入 password, 当然可以通过把 公钥保存在远程主机的 ~/.ssh 目录中,而后就不用输入password,但这需要配置.

用 sshpass 可能在命令输入 password, 但 需要用 “sudo apt-get install sshpass” 安装
如果不想用上面两种方法,可以用 expect 编写脚本可以帮助我们自动交互

虽然 Python 也提供 pexpect 模块,但既然 expect 很简单,为何不直接用 os.system() 去执行呢?

下面是我编写的类,实现了远程复制

[html] view plain
class RemoteShell:

def __init__(self, host, user, pwd):
self.host = host
self.user = user
self.pwd = pwd

def put(self, local_path, remote_path):
scp_put = '''
spawn scp %s %s@%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''
os.system("echo '%s' > scp_put.cmd" % (scp_put % (os.path.expanser(local_path), self.user, self.host, remote_path, self.pwd, self.pwd)))
os.system('expect scp_put.cmd')
os.system('rm scp_put.cmd')

但发现每次文件都没有复制完,我想看expect 究竟做了什么事情,还好 expect 提供 -d 参数给出更多的信息。
最后发现是被复制文件太大,expect 超时退出了

在脚本前加入 “set timeout -1" 就OK了

[html] view plain
scp_put = '''
set timeout -1
spawn scp %s %s@%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''

热点内容
php方法类 发布:2025-02-03 21:01:56 浏览:441
电脑基岩版材质包怎么安装到服务器里 发布:2025-02-03 20:57:33 浏览:389
linux文件组 发布:2025-02-03 20:53:51 浏览:327
db2存储执行变慢 发布:2025-02-03 20:42:21 浏览:765
滑板鞋脚本视频 发布:2025-02-02 09:48:54 浏览:433
群晖怎么玩安卓模拟器 发布:2025-02-02 09:45:23 浏览:558
三星安卓12彩蛋怎么玩 发布:2025-02-02 09:44:39 浏览:744
电脑显示连接服务器错误 发布:2025-02-02 09:24:10 浏览:537
瑞芯微开发板编译 发布:2025-02-02 09:22:54 浏览:147
linux虚拟机用gcc编译时显示错误 发布:2025-02-02 09:14:01 浏览:240