一個基於Python的shell自動化框架ShutIt
翻譯:雁驚寒
譯者註:本文通過實例簡單介紹了ShutIt這個基於Python的自動化框架的使用方法。除了pexpect,我們又多了這個選擇。以下是譯文。
ShutIt是一個易於使用的基於shell的自動化框架。它對基於python的expect庫(pexpect)進行了包裝。你可以把它看作是「沒有痛點的expect」。它可以通過pip進行安裝。
Hello World
讓我們從最簡單的例子開始吧。創建一個名為example.py的文件:
importshutitsession = shutit.create_session( bash )session.send( echo Hello World , echo=True)
運行這個文件:
pythonexample.py
輸出:
pythonexample.pyecho"Hello World"echo"Hello World"Hello WorldIans-MacBook-Air.local:ORIGIN_ENV:RhuebR2T#
「send」函數的第一個參數是要運行的命令。「echo」的參數將會輸出到終端上。默認情況下,ShutIt是靜默的。
登錄伺服器
如果你要登陸一台伺服器並執行伺服器上的命令。可以將example.py改為:
程序將登錄到這台伺服器上,並輸出主機名。
顯然,這很不安全!你可以這樣運行:
它會讓你輸入密碼:
同樣的,「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()
將輸出這樣的結果:
實例:監控多台伺服器
我們可以通過添加一些代碼邏輯來檢查命令的輸出,從而將上述代碼變成一個簡單的監控工具:
importshutitcapacity_command="""df / | awk | 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)
在這裡,我們用了「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.com80Trying216.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,04Jun201710:57:10GMT302 Moved302 MovedThe 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」來嘗試一個例子。
importshutitimporttimelong_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
點擊展開全文


※Python 爬蟲之 BeautifulSoup
※最近 Python 有點火?給你 7 個學習它的理由!
※Instagram 使用 Python 的經驗
※Python 函數中,參數是傳值,還是傳引用?
※揭示Python3.6的私有字典版本號
TAG:Python |
※如果有一個Party的Dress Code叫Van Gogh
※A real charm person.一個人真正的魅力
※換了剪輯師的the unit,等待下一個Wanna One
※評樂︳Jessie J與格萊美之間至少隔著一個Whitney Houston
※Zttp-一個基於 Guzzle Http 的更好用的 PHP HTTP Package
※work hard 和 hard work 哪一個是對的?
※英特爾正在為Spectre和Meltdown漏洞提供一個新的修復程序
※今日最佳:講一個 story,long long ago,有一個 king……
※女子組合fromis_9的第一個迷你專輯 to heart舉行了紀念活動
※Colette 前員工開了一個精品店,是個潮流版的 Colette
※Mac版Office與Windows共享一個代碼庫 獲得實時協作
※心靈日記(4)活出一個有愛的人生 Live a Life of Love
※又來一個黑腳趾!Air Jordan 1 「6 Rings」 清晰曝光
※Ice Cream Books,一個冰淇淋+書籍的創意營銷
※Everything:一個快速文件索引神器
※一個Windows PC用戶改換Mac設備鍵盤指南
※有想法!Facebook定義了一個新的時間單位Flicks
※一個反例讓我理解怎樣才是Bias lighting
※iPhoneX銷量不佳要停產 iPhone用戶卻迎來一個讓人振奮的消息
※茶的叫法可不只有「tea」,char、chay、chaw,舌頭一繞就一個名