译者注:本文通过实例简单介绍了ShutIt这个基于Python的自动化框架的使用方法。除了pexpect,我们又多了这个选择。以下是译文。

ShutIt是一个易于使用的基于shell的自动化框架。它对基于python的expect库(pexpect)进行了包装。你可以把它看作是“没有痛点的expect”。它可以通过pip进行安装。

Hello World

让我们从最简单的例子开始吧。创建一个名为example.py的文件:

  1. import shutit
  2. session = shutit.create_session('bash')
  3. session.send('echo Hello World', echo=True)

运行这个文件:

  1. python example.py

输出:

  1. python example.py
  2. echo "Hello World"
  3. echo "Hello World"
  4. Hello World
  5. Ians-MacBook-Air.local:ORIGIN_ENV:RhuebR2T#

“send”函数的第一个参数是要运行的命令。“echo”的参数将会输出到终端上。默认情况下,ShutIt是静默的。

登录服务器

如果你要登陆一台服务器并执行服务器上的命令。可以将example.py改为:

  1. import shutit
  2. session = shutit.create_session('bash')
  3. session.login('ssh you@example.com', user='you', password='mypassword')
  4. session.send('hostname', echo=True)
  5. session.logout()

程序将登录到这台服务器上,并输出主机名。

  1. hostname
  2. hostname
  3. example.com
  4. example.com:cgoIsdVv:heDa77HB#

显然,这很不安全!你可以这样运行:

  1. import shutit
  2. session = shutit.create_session('bash')
  3. password = session.get_input('', ispass=True)
  4. session.login('ssh you@example.com', user='you', password=password)
  5. session.send('hostname', echo=True)
  6. session.logout()

它会让你输入密码:

  1. Input Secret:
  2. hostname
  3. hostname
  4. example.com
  5. example.com:cgoIsdVv:heDa77HB#

同样的,“login”方法在登录后改变了提示符。你给了ShutIt一个登录命令,并附带用户名和密码(如果需要的话),然后,ShutIt会完成剩余的事情。

“logout”负责终止“login”,并向屏幕输出发生的任何变化。

登录到多台服务器

假设你有一个集群包含两台服务器,并希望同时登录到这两个服务器上去。则只需要创建两个会话,并运行类似的login和send命令:

  1. import shutit
  2. session1 = shutit.create_session('bash')
  3. session2 = shutit.create_session('bash')
  4. password1 = session1.get_input('Password for server1', ispass=True)
  5. password2 = session2.get_input('Password for server2', ispass=True)
  6. session1.login('ssh you@one.example.com', user='you', password=password1)
  7. session2.login('ssh you@two.example.com', user='you', password=password2)
  8. session1.send('hostname', echo=True)
  9. session2.send('hostname', echo=True)
  10. session1.logout()
  11. session2.logout()

将输出这样的结果:

  1. $ python example.py
  2. Password for server1
  3. Input Secret:
  4. Password for server2
  5. Input Secret:
  6. hostname
  7. hostname
  8. one.example.com
  9. one.example.com:Fnh2pyFj:qkrsmUNs# hostname
  10. hostname
  11. two.example.com
  12. two.example.com:Gl2lldEo:D3FavQjA#

实例:监控多台服务器

我们可以通过添加一些代码逻辑来检查命令的输出,从而将上述代码变成一个简单的监控工具:

  1. import shutit
  2. capacity_command="""df / | awk '{print $5}' | tail -1 | sed s/[^0-9]//"""
  3. session1 = shutit.create_session('bash')
  4. session2 = shutit.create_session('bash')
  5. password1 = session.get_input('Password for server1', ispass=True)
  6. password2 = session.get_input('Password for server2', ispass=True)
  7. session1.login('ssh you@one.example.com', user='you', password=password1)
  8. session2.login('ssh you@two.example.com', user='you', password=password2)
  9. capacity = session1.send_and_get_output(capacity_command)
  10. if int(capacity) < 10:
  11. print('RUNNING OUT OF SPACE ON server1!')
  12. capacity = session2.send_and_get_output(capacity_command)
  13. if int(capacity) < 10:
  14. print('RUNNING OUT OF SPACE ON server2!')
  15. session1.logout()
  16. session2.logout()

在这里,我们用了“sendandget_output”方法来获取capacity_command命令的输出。

还有很多更加优雅的方法可以完成上面的操作,但这取决于你想要Python有多聪明。

更复杂的IO – Expecting

假设你需要跟一个命令行程序进行交互,并且要实现自动化操作。在这里,我们使用telnet来举一个简单的例子:

  1. import shutit
  2. session = shutit.create_session('bash')
  3. session.send('telnet', expect='elnet>', echo=True)
  4. session.send('open google.com 80', expect='scape character', echo=True)
  5. session.send('GET /', echo=True, check_exit=False)
  6. session.logout()

注意“expect”的参数。你只需要给出telnet提示符的一个子集来进行匹配。

注意“check_exit”的参数,后面我们会讲到这个参数的。上面这段代码将输出:

  1. $ python example.py
  2. telnet
  3. telnet> open google.com 80
  4. Trying 216.58.214.14...
  5. Connected to google.com.
  6. Escape character is '^]'.
  7. GET /
  8. HTTP/1.0 302 Found
  9. Cache-Control: private
  10. Content-Type: text/html; charset=UTF-8
  11. Referrer-Policy: no-referrer
  12. Location: http://www.google.co.uk/?gfe_rd=cr&ei=huczWcj3GfTW8gfq0paQDA
  13. Content-Length: 261
  14. Date: Sun, 04 Jun 2017 10:57:10 GMT
  15. <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
  16. <TITLE>302 Moved</TITLE></HEAD><BODY>
  17. <H1>302 Moved</H1>
  18. The document has moved
  19. <A HREF="http://www.google.co.uk/?gfe_rd=cr&ei=huczWcj3GfTW8gfq0paQDA">
  20. here
  21. </A>.
  22. </BODY></HTML>
  23. Connection closed by foreign host.

现在回到“checkexit = false”上来。由于telnet命令会返回一个错误的退出码(1),我们不想让脚本执行失败,这里的“checkexit = false”能让ShutIt知道你并不关注这个退出码。

如果你没有传入这个参数,ShutIt会给你一个交互式的提示,如果你有终端接入的话。这被称为“暂停点”。

暂停点

你可以随便在什么时候通过调用以下方法来设置一个“暂停点”。

  1. [...]
  2. session.pause_point('This is a pause point')
  3. [...]

当脚本运行到暂停点时,同时按下“Ctrl”和“]”,则可以让脚本继续执行。这对于调试非常有用:添加一个暂停点,看看周围,然后继续。试试这个:

  1. import shutit
  2. session = shutit.create_session('bash')
  3. session.pause_point('Have a look around!')
  4. session.send('echo "Did you enjoy your pause point?"', echo=True)

程序输出:

  1. $ python example.py
  2. Have a look around!
  3. Ians-Air.home:ORIGIN_ENV:I00LA1Mq# bash
  4. imiell@Ians-Air:/space/git/shutit ⑂ master + 
  5. CTRL-] caught, continuing with run...
  6. 2017-06-05 15:12:33,577 INFO: Sending: exit
  7. 2017-06-05 15:12:33,633 INFO: Output (squashed): exitexitIans-Air.home:ORIGIN_ENV:I00LA1Mq# [...]
  8. echo "Did you enjoy your pause point?"
  9. echo "Did you enjoy your pause point?"
  10. Did you enjoy your pause point?
  11. Ians-Air.home:ORIGIN_ENV:I00LA1Mq#

更复杂的IO – Backgrounding

回到我们上面的“监控多台服务器”的例子上来。想象一下,我们要在每台服务器上运行一个长时间运行的任务。默认情况下,ShutIt会持续运行很长时间。但是我们可以在后台运行任务来加快ShutIt的运行速度。

在这里,你可以使用简单的命令“sleep 60”来尝试一个例子。

  1. import shutit
  2. import time
  3. long_command="""sleep 60"""
  4. session1 = shutit.create_session('bash')
  5. session2 = shutit.create_session('bash')
  6. password1 = session1.get_input('Password for server1', ispass=True)
  7. password2 = session2.get_input('Password for server2', ispass=True)
  8. session1.login('ssh you@one.example.com', user='you', password=password1)
  9. session2.login('ssh you@two.example.com', user='you', password=password2)
  10. start = time.time()
  11. session1.send(long_command, background=True)
  12. session2.send(long_command, background=True)
  13. print('That took: ' + str(time.time() - start) + ' seconds to fire')
  14. session1.wait()
  15. session2.wait()
  16. print('That took: ' + str(time.time() - start) + ' seconds to complete')

我的笔记本电脑说,运行这两个命令只需花费0.5秒,而脚本在一分钟以后才运行结束(使用了’wait’方法)。

虽然这个例子看起来是微不足道的,但是想像一下,如果你有数百台这样的服务器需要管理,那么你可以看到这几行代码和一个python import所带来的强大的力量。

作者:佚名

来源:51CTO

ShutIt:一个基于Python的shell自动化框架相关推荐

  1. python appium自动化测试框架unittest_Appium基于Python unittest自动化测试 自动化测试框架 -- PO并生成html测试报告...

    基于python单元测试框架unittest完成appium自动化测试,生成基于html可视化测试报告 代码示例: #利用unittest并生成测试报告 class Appium_test(unitt ...

  2. Python+Selenium WebUI自动化框架 -- 实现特殊PO模型

    前言: 设计执行格式,封装PO模型工厂,实现PO模型脱离代码,一套代码执行所有项目的UI自动化,让UI自动化框架脱离高成本.低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试 ...

  3. python自动化测试平台方案_基于Python的软件测试自动化平台研究

    基于 Python 的软件测试自动化平台研究 沈 啸 [摘 要] 摘要: 21 世纪是计算机和网络技术高速发展的时代,目前我国的软 件行业开发程度明显落后于欧美等发达国家,同时相对于开发工作而言,软件 ...

  4. 基于python的深度学习框架有_《用Python实现深度学习框架》上市

    朋友们,<用Python实现深度学习框架>已经由人民邮电出版社出版上市了.在这本书中,我们带领读者仅用Python+Numpy实现一个基于计算图的深度学习框架MatrixSlow.本书讲解 ...

  5. 一个基于Python的tkinter模块实现的游戏活动日历模拟器

    一个基于Python的tkinter模块实现的游戏活动日历模拟器 1.Python环境准备 2.简单介绍 3.源代码 4.源代码及活动配置表下载 1.Python环境准备 运行该项目需要Python3 ...

  6. python hacklib_【入门】angr:基于python的二进制分析框架

    文章难易度:★★★ 文章阅读点/知识点:angr:基于python的二进制分析框架 文章作者:desword

  7. python云盘私有云_GitHub - 0x2642/Umi-Chest: 一个基于python的私有云实验项目

    Umi-Chest 一个基于angular 4的单页面舰娘百科App 关于项目名是因为kuma一直找不到好的名字,因为联想到海,然后我喜欢海爷,所以本来想叫海爷百宝箱什么的(一个舰娘的App你叫海爷百 ...

  8. python 端口扫描 东京_GitHub - w2n1ck/portscan: 一个基于Python+Go的端口扫描及服务探测脚本...

    portscan 一个基于Python+Go的端口扫描及服务探测脚本 0x00 前言 近期由于公司环境整改/迭代以及历史弱口令等撞库,运维同事将内网测试环境的一些SSH等敏感端口对外,导致被挖矿团伙利 ...

  9. 一个基于Python数据大屏可视化开源项目

    ‍‍ 今天给大家介绍一个开源数据大屏可视化工具. 项目简介 这是一个基于Python开发的,结构简单的项目.可通过配置Json的数据,实现数据报表大屏显示. 优点:代码清晰.结构简单.配置Json数据 ...

最新文章

  1. linux的/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow—关于用户和组的配置文件
  2. vs下载python最后一点很慢-python读取大文件越来越慢的原因与解决
  3. 指针和数组的区别是什么?
  4. linux 条件变量
  5. 2012年第一篇博文——致谢:2011年中国IT十大杰出博客获奖感言
  6. DataGridView使用技巧一:获取或设置当前单元格的内容
  7. (转)cocos2d-x学习笔记(九)使用shader创建鱼的投影
  8. keras ConvLSTM2D 的简单应用
  9. 演练nerddinner 问题
  10. LeetCode 169 Majority Element 解题报告
  11. 通过adb命令安装卸载apk
  12. 倒计时电路multisim10s_multisim10秒倒计时器
  13. vue3父传子,子传父
  14. 零基础学习HTML(5)——link、base标签的使用
  15. JavaScrapt朝花夕拾
  16. 数据元素、数据项、数据对象的概念详解
  17. inches 和像素的换算
  18. MySQL数据库管理系统原理
  19. 求职真的是欲哭无泪,520,521还要继续找工作
  20. 格式化输出(占位符%)

热门文章

  1. 你好,欢迎来到我的空间,
  2. 进程线程的调度阻塞唤醒
  3. 使用Xshell密钥认证远程登录linux
  4. @SuppressWarnings(rawtypes)
  5. SecureCRT登录本地cygwin。
  6. Android Studio编码问题
  7. flask及扩展源码解读
  8. Ansible 详细用法部署安装
  9. 线程创建 pthread_create 中自定义参数注意事项
  10. 一个页面可以重复调用的TAB选项卡切换js代码 鼠标悬浮