Python pexpect 库的简单使用
一、Python pexpect 库的使用
在终端中许多命令都有与用户交互的场景,例如切换用户时需要手动输入密码,安装应用有时要输入默认配置等。这对 shell 自动化脚本十分不便。expect 命令的出现解决了上述问题。下面简单演示 shell 中使用 expect 命令自动输入密码切换用户并用切换后的用户执行命令的流程。
原版 shell 执行 expect 命令演示
在终端按以下步骤执行(其中 123 是 root 用户的密码),可以登录到 root 用户的终端。
user@host:~$ expect
expect1.1> set tiemout 5
5
expect1.2> spawn su
spawn su
3712
expect1.3> expect "Password" "密码"
Password: expect1.4> send "123\n"
expect1.5> interact
root@host:/home/user#
这样就进入了 root 用户的终端。这时或许会有人说,写这么多,还不如直接执行 su 命令。事实上,真正的 expect 指令不会像这样直接在终端运行,而是作为脚本来运行。下面使用 Python 的 os 库中的 system 函数模拟在终端输入命令。以脚本的方式运行,感受 expect 的强大。
from os import system as shell_command
# expect 脚本如下
script = """#!/usr/bin/expect
set timeout 5
spawn su
expect {
"Password" {send "123\\\\r"}
"密码" {send "123\\\\r"}
}
send "whoami > whoami.txt\\\\r"
send "exit\\\\r"
expect eof
"""
# print(script)
# 先清理先前测试残留的文件
shell_command("rm -f whoami.txt")
# 用 echo 的方式创建 expect 脚本
shell_command("echo '" + script + "' > /tmp/shell_expect_su_script.sh")
shell_command("chmod +x /tmp/shell_expect_su_script.sh")
shell_command("/tmp/shell_expect_su_script.sh")
print("\ncat whoami.txt = ", end="")
shell_command("cat whoami.txt")
spawn su
Password:
root@Master: /home/hadooproot@Master/home/hadoop# whoami > whoami.txt
root@Master: /home/hadooproot@Master/home/hadoop# exit
exit
cat whoami.txt = root
0
在上面的例子中,无需手动输入 root 用户的密码,即可登录进 root 用户的终端,并将自己的名称(root)写入文件 whoami.txt 中。由此看来,有了 expect 命令,使全自动化脚本成为了可能。
Python 自动化脚本 pexpect 库演示
在 Python 中,提供了 pexpect 库,可以十分方便地使用 Python 代码实现 expect 命令的功能。下面演示使用 pexpect 切换到 root 用户并在 text.txt 中写入一些数据,最后用 os 库的 system 函数执行 cat 命令读取 text.txt 文件内容验证执行结果。
import pexpect, os
# 先清理先前残留下的文件
os.system("rm -f text.txt")
os.system("ls -l | grep 'text.txt'")
process = pexpect.spawn("su")
process.timeout = 5
process.expect("Password")
process.sendline("123")
process.sendline("echo export PATH=/home/hadoop > text.txt")
process.sendline("EOF")
process.close()
os.system("ls -l text.txt")
os.system("cat text.txt")
-rw-r--r-- 1 root root 25 Mar 10 23:30 text.txt
export PATH=/home/hadoop
0
可见,使用 Python 代码可以更加方便地实现 expect 的功能。
expect 脚本讲解
现在,讲解一下上述例子中 expect 脚本中的内容。
#!/usr/bin/expect # 这条语句告诉操作系统用来解释脚本的程序的位置
set timeout 5 # 设置超时时间,单位是秒。超过这个时长,就认为执行失败并退出。
# 例如在这里,如果密码 ‘123’ 是错误的,那么等待 5 秒后无法登录进去就会退出。
spawn su # spawn 是 expect 的内部指令,后面接要在 shell 执行的命令,
# 这样 expect 会开启一个新的进程来执行这个命令并监听它。
expect { # expect 的中文是 ‘期待’ 的意思,顾名思义,expect 会期待出现指定的字符串。
"Password" {send "123\r"} # 双引号(必须写双引号,不能是单引号)中是 expect 指令等待 spawn 生成的程序
# (这里是 su)出现的字符串。
#
# 这里当 su 命令执行后出现 “Password” 时,就发送 send 后面的字符串 "123\r"
# 给 su 命令。
#
# 注意:123 后面的 \r 不能少,它表示我们输入 123 后按下的回车键。
"密码" {send "123\r"} # 与上面一样,只不过这里 expect 期待的是 “密码” 而不是 “Password”。
}
send "whoami > whoami.txt\r" # 此时不出意外的话已经进入 root 的终端了,这里直接发送终端命令即可执行,同样注意 \r 不能少。
send "exit\r" # 发送命令 exit 退出 root 的终端。
expect eof # 结束整个 expect 命令
参考:
shell expect的简单用法
Linux expect 介绍和用法
python之pexpect模块
#!/bin/bash
Python pexpect 库的简单使用的更多相关文章
- Python Pexpect库的简单使用
Python Pexpect库的使用 简介 最近需要远程操作一个服务器并执行该服务器上的一个python脚本,查到可以使用Pexpect这个库.记录一下. 什么是Pexpect?Pexpect能够产生 ...
- python第三方库requests简单介绍
一.发送请求与传递参数 简单demo: import requests r = requests.get(url='http://www.itwhy.org') # 最基本的GET请求 print(r ...
- python requests库的简单使用
requests是python的一个HTTP客户端库,跟urllib,urllib2类似,但比urllib,urllib2更加使用简单. 1. requests库的安装在你的终端中运行pip安装命令即 ...
- Python turtle库绘制简单图形
一.简介 Python中的turtle库是一个直观有趣的图形绘制函数库.turtle库绘制图形有一个基本框架:一个小海龟在坐标系中爬行,其爬行轨迹形成了绘制图形. 二.简单的图形列举 1.绘制4个不同 ...
- python urllib2库的简单总结
urllib2的简单介绍参考网址:http://www.voidspace.org.uk/python/articles/urllib2.shtml Fetching URLsThe simplest ...
- python requests库的简单运用
python requests的简单运用 使用pycharm获取requests包 ctrl+alt+s Project:pythonProject pythoninterpreter 点+号搜索 使 ...
- python第三方库,你要的这里都有
Python的第三方库多的超出我的想象. python 第三方模块 转 https://github.com/masterpy/zwpy_lst Chardet,字符编码探测器,可以自动检测文本. ...
- python常用库(转)
转自http://www.west999.com/info/html/wangluobiancheng/qita/20180729/4410114.html Python常用的库简单介绍一下 fuzz ...
- Python全部库整理
库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...
- python的库有多少个?python有多少个模块?
这里列举了大概500个左右的库: ! Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主 ...
随机推荐
- Jmeter 请求或响应中文乱码
1.首先检查 请求编码和后台接受编码是否一致,如果在查看结果树中 请求的中文不是乱码 而添加到后台程序是乱码 一般都是请求和接受编码不一致造成的 2.如果请求是get 请求中有中文 Content e ...
- 修改 npm 全局模块及模块缓存存放位置
说明 npm 全局模块安装将包安装到 C:\Users\%user%\AppData\Roaming\npm 目录下,缓存则放于 C:\Users\%user%\AppData\Roaming\npm ...
- GPIO原理及配制方法
GPIO原理及配制方法 引用地址: ARM SOC芯片的GPIO结构示意图 @@@ GPIO的八种模式 1,输入浮空模式 2,输入上拉模式 3,输入下拉模式 4,模拟输入模式 5,开漏输出模式 6,开 ...
- 三本书带您快速深入掌握Spring Boot应用开发《Spring Boot从零开始学(视频教学版)》
#好书推荐##好书奇遇季#三本书带您快速深入掌握Spring Boot应用开发<Spring Boot从零开始学(视频教学版)><Spring Boot应用开发实战><深 ...
- 正则表达式re.compile()的使用
re 模块提供了不少有用的函数,用以匹配字符串,比如: compile 函数match 函数search 函数findall 函数finditer 函数split 函数sub 函数subn 函数re ...
- vue element-ui form验证中自定义验证方式通过不返回true问题
项目中使用了element-ui的form验证,自定义了手机号的验证规则,验证不通过的时候定义了callback()扔出错误.但是忘了写通过的callback().导致form验证通过拿不到返回的va ...
- WinForm嵌入Web网站
1.安装CefSharp 2.GetMac()获取用户mac地址方法 3.根据错误提示新建CEFKeyBoardHander.cs form1.cs using CefSharp; using Cef ...
- 基于SDN控制器(ONOS)实现量子设备配置管理
基础知识 基于SDN控制器(ONOS)实现量子设备配置管理,首先选择合适的南向协议.OpenFlow与NETCONF是两个最适合企业网场景使用的协议.目前各大网络厂商的网络设备都已基本宣称支持NETC ...
- RayLink远程控制软件:叮~你收到一份年度关键词报告
叮~~~ 今天是12月31日,2022年的最后一天.今天过后,明天就是2023年啦!R君提前恭祝大家新年快乐,温情满满的跨年之际,RayLink感恩2022遇见大家,2023还请大家多多关照~ 202 ...
- 在Vue项目中使用wangEditor
wangEditor官网 封装的Editor组件 <template> <div class="editor-wrap"> <div ref=&quo ...