ShutIt:一個基於Python的shell自動化框架
原文:ShutIt
翻譯:雁驚寒
譯者注:本文通過例項簡單介紹了ShutIt這個基於Python的自動化框架的使用方法。除了pexpect,我們又多了這個選擇。以下是譯文。
ShutIt是一個易於使用的基於shell的自動化框架。它對基於python的expect庫(pexpect)進行了包裝。你可以把它看作是“沒有痛點的expect”。它可以通過pip進行安裝。
Hello World
讓我們從最簡單的例子開始吧。建立一個名為example.py的檔案:
import shutit
session = shutit.create_session('bash')
session.send('echo Hello World' , echo=True)
執行這個檔案:
python example.py
輸出:
python example.py
echo "Hello World"
echo "Hello World"
Hello World
Ians-MacBook-Air.local:ORIGIN_ENV:RhuebR2T#
“send”函式的第一個引數是要執行的命令。“echo”的引數將會輸出到終端上。預設情況下,ShutIt是靜默的。
登入伺服器
如果你要登陸一臺伺服器並執行伺服器上的命令。可以將example.py改為:
import shutit
session = shutit.create_session('bash' )
session.login('ssh [email protected]', user='you', password='mypassword')
session.send('hostname', echo=True)
session.logout()
程式將登入到這臺伺服器上,並輸出主機名。
hostname
hostname
example.com
example.com:cgoIsdVv:heDa77HB#
顯然,這很不安全!你可以這樣執行:
import shutit
session = shutit.create_session('bash')
password = session.get_input('' , ispass=True)
session.login('ssh [email protected]', user='you', password=password)
session.send('hostname', echo=True)
session.logout()
它會讓你輸入密碼:
Input Secret:
hostname
hostname
example.com
example.com:cgoIsdVv:heDa77HB#
同樣的,“login”方法在登入後改變了提示符。你給了ShutIt一個登入命令,並附帶使用者名稱和密碼(如果需要的話),然後,ShutIt會完成剩餘的事情。
“logout”負責終止“login”,並向螢幕輸出發生的任何變化。
登入到多臺伺服器
假設你有一個叢集包含兩臺伺服器,並希望同時登入到這兩個伺服器上去。則只需要建立兩個會話,並執行類似的login和send命令:
import shutit
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 [email protected]', user='you', password=password1)
session2.login('ssh [email protected]', user='you', password=password2)
session1.send('hostname', echo=True)
session2.send('hostname', echo=True)
session1.logout()
session2.logout()
將輸出這樣的結果:
$ python example.py
Password for server1
Input Secret:
Password for server2
Input Secret:
hostname
hostname
one.example.com
one.example.com:Fnh2pyFj:qkrsmUNs# hostname
hostname
two.example.com
two.example.com:Gl2lldEo:D3FavQjA#
例項:監控多臺伺服器
我們可以通過新增一些程式碼邏輯來檢查命令的輸出,從而將上述程式碼變成一個簡單的監控工具:
import shutit
capacity_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 [email protected]', user='you', password=password1)
session2.login('ssh [email protected]', user='you', password=password2)
capacity = session1.send_and_get_output(capacity_command)
if int(capacity) < 10:
print('RUNNING OUT OF SPACE ON server1!')
capacity = session2.send_and_get_output(capacity_command)
if int(capacity) < 10:
print('RUNNING OUT OF SPACE ON server2!')
session1.logout()
session2.logout()
在這裡,我們用了“sendandget_output”方法來獲取capacity_command命令的輸出。
還有很多更加優雅的方法可以完成上面的操作,但這取決於你想要Python有多聰明。
更復雜的IO - Expecting
假設你需要跟一個命令列程式進行互動,並且要實現自動化操作。在這裡,我們使用telnet來舉一個簡單的例子:
import shutit
session = 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.py
telnet
telnet> open google.com 80
Trying 216.58.214.14...
Connected to google.com.
Escape character is '^]'.
GET /
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.co.uk/?gfe_rd=cr&ei=huczWcj3GfTW8gfq0paQDA
Content-Length: 261
Date: Sun, 04 Jun 2017 10:57:10 GMT
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.uk/?gfe_rd=cr&ei=huczWcj3GfTW8gfq0paQDA">
here
</A>.
</BODY></HTML>
Connection closed by foreign host.
現在回到“checkexit = false”上來。由於telnet命令會返回一個錯誤的退出碼(1),我們不想讓指令碼執行失敗,這裡的“checkexit = false”能讓ShutIt知道你並不關注這個退出碼。
如果你沒有傳入這個引數,ShutIt會給你一個互動式的提示,如果你有終端接入的話。這被稱為“暫停點”。
暫停點
你可以隨便在什麼時候通過呼叫以下方法來設定一個“暫停點”。
[...]
session.pause_point('This is a pause point')
[...]
當指令碼執行到暫停點時,同時按下“Ctrl”和“]”,則可以讓指令碼繼續執行。這對於除錯非常有用:新增一個暫停點,看看周圍,然後繼續。試試這個:
import shutit
session = shutit.create_session('bash')
session.pause_point('Have a look around!')
session.send('echo "Did you enjoy your pause point?"', echo=True)
程式輸出:
$ python example.py
Have a look around!
Ians-Air.home:ORIGIN_ENV:I00LA1Mq# bash
imiell@Ians-Air:/space/git/shutit ⑂ master +
CTRL-] caught, continuing with run...
2017-06-05 15:12:33,577 INFO: Sending: exit
2017-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”來嘗試一個例子。
import shutit
import time
long_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 [email protected]', user='you', password=password1)
session2.login('ssh [email protected]', 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:一個基於Python的shell自動化框架
原文:ShutIt 翻譯:雁驚寒 譯者注:本文通過例項簡單介紹了ShutIt這個基於Python的自動化框架的使用方法。除了pexpect,我們又多了這個選擇。以下是譯文。ShutIt是一個易於使用的基於shell的自動化框架。它對基於python的exp
初識TPOT:一個基於Python的自動化機器學習開發工具
1. TPOT介紹 一般來講,建立一個機器學習模型需要經歷以下幾步: 資料預處理 特徵工程 模型選擇 超引數調整 模型儲存 本文介紹一個基於遺傳演算法的快速模型選擇及調參的方法,TPOT:一種基於Python的自動機器學習開發工具。專案原始碼位於:https://github.com/EpistasisL
pyDash:一個基於 web 的 Linux 性能監測工具
亮顯 依賴關系 stat 運行 tld 下一個 google avi 查看 pyDash 是一個輕量且基於 web 的 Linux 性能監測工具,它是用 Python 和 Django 加上 Chart.js 來寫的。經測試,在下面這些主流 Linux 發行版上可運行:Ce
jQuery EasyUI一個基於 jQuery 的框架(創建網頁所需的一切)
fault def edi lec ... center icon jquer timeout jQuery EasyUI學習網址:http://www.runoob.com/jeasyui/jqueryeasyui-tutorial.html jQuery MiniUI
Spring Boot入門第二天:一個基於Spring Boot的Web應用,使用了Spring Data JPA和Freemarker。
per pan let mysq 應用 posit ble host thead 今天打算從數據庫中取數據,並展示到視圖中。不多說,先上圖: 第一步:添加依賴。打開pom.xml文件,添加必要的依賴,完整代碼如下: <?xml version="1.0" enco
Ocelot.JwtAuthorize:一個基於網關的Jwt驗證包
auth context 分享圖片 mis aud readonly display view clas Ocelot作為基於.net core的API方關,有一個功能是統一驗證,它的作用是把沒有訪問權限的請求擋在API網關外面,而不是到達API網關事端的API時才去驗證;
yunBT:一個基於TP3.1的多使用者BT離線下載程式,支援線上播放
說明:yunBT這個專案其實很早就有了,只是老沒更新,現在作者基於ThinkCMS重做該程式,支援多使用者註冊下載,Magnet和HTTP下載。每個單獨使用者支援10個任務,預設下載檔案最大為10GB,可以在後臺修改。下載完成後使用者可以直接檢視下載的檔案僅支援mp4檔案線上播放。管理員可以新增使用者的下載量
php_crond:一個基於多程序的定時任務系統-支援秒粒度的任務配置
php_crond 基於多程序的定時工作管理員,支援秒級別的定時任務 特性 通過配置檔案管理所有定時任務 支援秒級的定時任務粒度 使用symfony/process進行程序管理 使用React/event-loop執行事件迴圈 提供http服務,遠端檢視
碼客幫:一個基於程式設計師社群的網際網路軟體眾包平臺
去年流行一句話“我有一個好的創業想法,就差一個程式設計師了”,雖然這是一句調侃,但在“網際網路+”的背景下,不管是傳統企業還是網際網路初創企業,都有非常強烈的軟體技術服務(軟體外包)訴求。找外包,很多人可能會想到豬八戒網,但在這樣的平臺上,是需要客戶親自稽核大批的開發者和報價。而且這些平臺的開發成果
pyDash:一個基於 web 的 Linux 效能監測工具
pyDash 是一個輕量且基於 web 的 Linux 效能監測工具,它是用 Python 和 Django 加上 Chart.js 來寫的。經測試,在下面這些主流 Linux 發行版上可執行:CentOS、Fedora、Ubuntu、Debian、Raspbian 以及 Pidora 。-- Ravi
自然語言處理組2017論文研讀1:ME-MD:一個有效的神經系統框架
ME-MD:一個有效的神經系統框架具有多個編碼器和解碼器的機器翻譯Jinchao Zhang1 Qun Liu3,1 Jie Zhou2 1Key Laboratory of IntelligentInformation Processing, Institute of Co
Ocelot.JwtAuthorize:一個基於閘道器的Jwt驗證包
Ocelot作為基於.net core的API方關,有一個功能是統一驗證,它的作用是把沒有訪問許可權的請求擋在API閘道器外面,而不是到達API閘道器事端的API時才去驗證;之前我有一篇博文https://www.cnblogs.com/axzxs2001/p/8005084.html,作過說明,這篇博文說明
手把手寫一個基於Spring Boot框架下的引數校驗元件(JSR-303)
前言 之前參與的新開放平臺研發的過程中,由於不同的介面需要對不同的入參進行校驗,這就涉及到通用引數的校驗封裝,如果不進行封裝,那麼寫出來的校驗程式碼將會風格不統一、校驗工具類不一致、維護風險高等其它因素,於是我對其公共的校驗做了一個封裝,達到了通過註解的方式即可實現引數統一校驗。 遇到的問
Vue3教程:一個基於 Vue 3 + Vant 3 的商城專案開源啦!
之前釋出過一篇文章,告訴大家我要開發一個 Vue3 的商城專案並開源到 GitHub 上,供大家練手和學習,隨後也一直有收到留言和反饋,問我開發到哪裡了,什麼時候開源之類的問題,今天終於可以通知大家,完成啦!
一個基於Python的shell自動化框架ShutIt
ShutIt是一個易於使用的基於shell的自動化框架。它對基於python的expect庫(pexpect)進行了包裝。你可以把它看作是“沒有痛點的expect”。它可以通過pip進行安裝。 Hello World 讓我們從最簡單的例子開始吧。建立一個名為example.py的檔
一個基於python+selenium的page-object自動化測試框架
先上框架git連結:https://gitee.com/yukarijiang/watcher#0-qzone-1-79223-d020d2d2a4e8d1a374a433f596ad1440這個框架目前才剛剛起步,還有很多不完善和不適當的地方,但可以用於學習selenium
設計模式-代理類proxy:一個介面多個實現類(基於spring框架)
根據前臺返回的不同引數,選擇一個介面不同的實現類來實現不同業務邏輯,我們用到了proxy代理類。 首先是spring.xml 配置檔案 如下:(proxy 表示代理類 ××ServiceImpl 表示實現類) <bean id="介面名稱" >
CXF 入門:創建一個基於WS-Security標準的安全驗證(CXF回調函數使用)
urn star cti say struct stc lba features ear 註意:以下客戶端調用代碼中獲取服務端ws實例,都是通過CXF 入門: 遠程接口調用方式實現 以下是服務端配置 ===================================
一個基於JRTPLIB的輕量級RTSP客戶端(myRTSPClient)——實現篇:(六)RTP音視頻傳輸解析層之音視頻數據傳輸格式
客戶端 會有 服務 client 基本 cnblogs 存在 額外 導致 一、差異 本地音視頻數據格式和用來傳輸的音視頻數據格式存在些許差異,由於音視頻數據流到達客戶端時,需要考慮數據流的數據邊界、分包、組包順序等問題,所以傳輸中的音視頻數據往往會多一些字節。 舉個例子
一個基於JRTPLIB的輕量級RTSP客戶端(myRTSPClient)——實現篇:(九)以g711-mulaw為例添加新的編碼格式解析支持
調用 pcm 2個 h265 pri 源碼 返回 .cn memcpy 一、myRtspClient音頻解析架構 AudioTypeBase是處理解析各種編碼的音頻數據的接口類。處理MPA數據的MPEG_Audio類和處理g711-mulaw的PCMU_Audio類均從Au