python手机自动化框架_开源|一个基于Python的shell自动化框架ShutIt

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

登录服务器

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

importshutitsession = shutit.create_session( 'bash')session.login( 'ssh you@example.com', user= 'you', password= 'mypassword')session.send( 'hostname', echo=True)session.logout()

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

hostnamehostnameexample. comexample. com:cgoIsdV v:heDa77HB#

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

importshutitsession = shutit.create_session( 'bash')password = session.get_input( '', ispass= True)session.login( 'ssh you@example.com', user= 'you', password=password)session.send( 'hostname', echo= True)session.logout()

它会让你输入密码:

Input Secre t:hostnamehostnameexample. comexample. com:cgoIsdV v:heDa77HB#

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

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

登录到多台服务器

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

import shutitsession1 = shutit.create_session( 'bash')session2 = shutit.create_session( 'bash')password1 = session1.get_input( 'Password for server1', ispass= True)password2 = session2.get_input( 'Password for server2', ispass= True)session1.login( 'ssh you@one.example.com', user= 'you', password=password1)session2.login( 'ssh you@two.example.com', user= 'you', password=password2)session1.send( 'hostname', echo= True)session2.send( 'hostname', echo= True)session1.logout()session2.logout()

将输出这样的结果:

$ pythonexample. pyPassword forserver1Input Secre t:Password forserver2Input Secre t:hostnamehostnameone.example. comone.example. com:Fnh2pyFj:qkrsmUNs# hostnamehostnametwo.example. comtwo.example. com:Gl2lldEo:D3FavQjA#

实例:监控多台服务器

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

importshutitcapacity_command= """df / | awk '{print $5}' | tail -1 | sed s/[^0-9]//"""session1 = shutit.create_session( 'bash')session2 = shutit.create_session( 'bash')password1 = session.get_input( 'Password for server1', ispass= True)password2 = session.get_input( 'Password for server2', ispass= True)session1.login( 'ssh you@one.example.com', user= 'you', password=password1)session2.login( 'ssh you@two.example.com', user= 'you', password=password2)capacity = session1.send_and_get_output(capacity_command) ifint(capacity) < 10: print( 'RUNNING OUT OF SPACE ON server1!')capacity = session2.send_and_get_output(capacity_command) ifint(capacity) < 10: print( 'RUNNING OUT OF SPACE ON server2!')session1.logout()session2.logout()

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

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

更复杂的IO - Expecting

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

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

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

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

$ python example.pytelnettelnet> open google.com 80Trying 216.58.214.14...Connected to google.com.Escape character is '^]'.GET /HTTP/ 1.0302FoundCache-Control: privateContent-Type: text/html; charset=UTF -8Referrer-Policy: no-referrerLocation: http: //www.google.co.uk/?gfe_rd=cr&ei=huczWcj3GfTW8gfq0paQDAContent-Length: 261Date: Sun, 04Jun 201710: 57: 10GMT

302 Moved

302 Moved

The document has movedhere.Connection closed by foreign host.

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

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

暂停点

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

[ ...]session.pause_point( 'Thisis a pause point')[ ...]

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

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

程序输出:

$ python example.pyHave a look around!Ians-Air.home:ORIGIN_ENV:I00LA1Mq # bashimiell@Ians-Air:/space/git/shutit ⑂ master +  CTRL-] caught, continuing with run...2017-06-05 15:12:33,577 INFO: Sending: exit2017-06-05 15:12:33,633 INFO: Output (squashed): exitexitIans-Air.home:ORIGIN_ENV:I00LA1Mq # [...]echo"Did you enjoy your pause point?"echo"Did you enjoy your pause point?"Did you enjoy your pause point?Ians-Air.home:ORIGIN_ENV:I00LA1Mq #

更复杂的IO - Backgrounding

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

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

importshutit importtimelong_command= """sleep 60"""session1 = shutit.create_session( 'bash')session2 = shutit.create_session( 'bash')password1 = session1.get_input( 'Password for server1', ispass= True)password2 = session2.get_input( 'Password for server2', ispass= True)session1.login( 'ssh you@one.example.com', user= 'you', password=password1)session2.login( 'ssh you@two.example.com', user= 'you', password=password2)start = time.time()session1.send(long_command, background= True)session2.send(long_command, background= True)print( 'That took: '+ str(time.time() - start) + ' seconds to fire')session1.wait()session2.wait()print( 'That took: '+ str(time.time() - start) + ' seconds to complete')

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

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

更多信息

ShutIt可以做很多事。更多信息,请参阅:

- ShutIt

- GitHub

PHPer升级为大神并不难!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值