成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ShutIt:一個基于Python的shell自動化框架

開發 后端 自動化
本文通過實例簡單介紹了ShutIt這個基于Python的自動化框架的使用方法。

[[194837]]

譯者注:本文通過實例簡單介紹了ShutIt這個基于Python的自動化框架的使用方法。除了pexpect,我們又多了這個選擇。以下是譯文。

ShutIt是一個易于使用的基于shell的自動化框架。它對基于python的expect庫(pexpect)進行了包裝。你可以把它看作是“沒有痛點的expect”。它可以通過pip進行安裝。

Hello World

讓我們從最簡單的例子開始吧。創建一個名為example.py的文件:

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

運行這個文件:

  1. python example.py 

輸出:

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

“send”函數的***個參數是要運行的命令。“echo”的參數將會輸出到終端上。默認情況下,ShutIt是靜默的。

登錄服務器

如果你要登陸一臺服務器并執行服務器上的命令。可以將example.py改為:

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

程序將登錄到這臺服務器上,并輸出主機名。

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

顯然,這很不安全!你可以這樣運行:

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

它會讓你輸入密碼:

  1. Input Secret: 
  2.  
  3. hostname 
  4.  
  5. hostname 
  6.  
  7. example.com 
  8.  
  9. example.com:cgoIsdVv:heDa77HB#  

同樣的,“login”方法在登錄后改變了提示符。你給了ShutIt一個登錄命令,并附帶用戶名和密碼(如果需要的話),然后,ShutIt會完成剩余的事情。

“logout”負責終止“login”,并向屏幕輸出發生的任何變化。

登錄到多臺服務器

假設你有一個集群包含兩臺服務器,并希望同時登錄到這兩個服務器上去。則只需要創建兩個會話,并運行類似的login和send命令:

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

將輸出這樣的結果:

  1. $ python example.py 
  2.  
  3. Password for server1 
  4.  
  5. Input Secret: 
  6.  
  7. Password for server2 
  8.  
  9. Input Secret: 
  10.  
  11. hostname 
  12.  
  13. hostname 
  14.  
  15. one.example.com 
  16.  
  17. one.example.com:Fnh2pyFj:qkrsmUNs# hostname 
  18.  
  19. hostname 
  20.  
  21. two.example.com 
  22.  
  23. two.example.com:Gl2lldEo:D3FavQjA#  

實例:監控多臺服務器

我們可以通過添加一些代碼邏輯來檢查命令的輸出,從而將上述代碼變成一個簡單的監控工具:

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

在這里,我們用了“sendandget_output”方法來獲取capacity_command命令的輸出。

還有很多更加優雅的方法可以完成上面的操作,但這取決于你想要Python有多聰明。

更復雜的IO – Expecting

假設你需要跟一個命令行程序進行交互,并且要實現自動化操作。在這里,我們使用telnet來舉一個簡單的例子:

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

注意“expect”的參數。你只需要給出telnet提示符的一個子集來進行匹配。

注意“check_exit”的參數,后面我們會講到這個參數的。上面這段代碼將輸出:

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

現在回到“checkexit = false”上來。由于telnet命令會返回一個錯誤的退出碼(1),我們不想讓腳本執行失敗,這里的“checkexit = false”能讓ShutIt知道你并不關注這個退出碼。

如果你沒有傳入這個參數,ShutIt會給你一個交互式的提示,如果你有終端接入的話。這被稱為“暫停點”。

暫停點

你可以隨便在什么時候通過調用以下方法來設置一個“暫停點”。

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

當腳本運行到暫停點時,同時按下“Ctrl”和“]”,則可以讓腳本繼續執行。這對于調試非常有用:添加一個暫停點,看看周圍,然后繼續。試試這個:

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

程序輸出:

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

更復雜的IO – Backgrounding

回到我們上面的“監控多臺服務器”的例子上來。想象一下,我們要在每臺服務器上運行一個長時間運行的任務。默認情況下,ShutIt會持續運行很長時間。但是我們可以在后臺運行任務來加快ShutIt的運行速度。

在這里,你可以使用簡單的命令“sleep 60”來嘗試一個例子。

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

我的筆記本電腦說,運行這兩個命令只需花費0.5秒,而腳本在一分鐘以后才運行結束(使用了’wait’方法)。

雖然這個例子看起來是微不足道的,但是想像一下,如果你有數百臺這樣的服務器需要管理,那么你可以看到這幾行代碼和一個python import所帶來的強大的力量。

更多信息

ShutIt可以做很多事。更多信息,請參閱:

  • ShutIt (https://ianmiell.github.io/shutit/)
  • GitHub (https://github.com/ianmiell/shutit/blob/master/README.md) 
責任編輯:龐桂玉 來源: Python開發者
相關推薦

2025-06-20 02:11:00

2019-08-14 10:49:20

Python編程語言代碼

2019-04-22 09:00:00

Python框架自動化測試

2023-07-24 10:58:51

CIO自動化

2021-06-02 09:32:46

Angular自動化功能請求

2021-04-01 10:51:44

機器人人工智能編程

2020-11-06 08:43:21

AIOps運維DevOps

2022-04-11 15:34:29

機器學習AutoML開源

2023-12-21 11:12:31

Node.js.NET開源庫

2024-05-13 16:29:56

Python自動化

2025-01-08 11:00:00

AIshell開源

2018-12-10 08:10:39

2024-11-13 13:14:38

2020-04-28 09:00:00

測試測試自動化

2022-02-17 13:03:28

Python腳本代碼

2024-06-21 10:46:44

2024-08-16 21:51:42

2017-11-27 15:17:24

PythonMonkey腳本

2022-02-17 10:37:16

自動化開發團隊預測

2021-02-03 09:04:11

解密Spring配置
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频精品 | 99在线资源 | 国产精品久久久久久久久 | 精品美女视频在线观看免费软件 | 国产区在线观看 | 成人深夜福利在线观看 | 亚洲精品区 | 欧美日韩1区 | 亚洲一区二区免费电影 | 91亚洲精品久久久电影 | 国产欧美视频一区二区三区 | 久久精品一区二区 | 性视频一区 | 4hu最新网址 | 国产激情视频网址 | 国产日韩欧美另类 | 国产精品欧美一区喷水 | 久久中文免费视频 | 国产精品视频一区二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 麻豆va | 在线成人av | 欧美1区 | 欧美国产日韩在线 | 精品视频网 | 国产精品久久久久久久7电影 | av免费在线观看网站 | 日韩图区 | 成人免费区一区二区三区 | 欧美日韩国产精品一区二区 | 全部免费毛片在线播放网站 | 国产成人精品a视频一区www | 综合色在线 | 337p日本欧洲亚洲大胆 | 欧美日韩一二三区 | 91精品国产91久久久久游泳池 | 国产精品一区二区不卡 | 国产精品久久久久久妇女6080 | 久久久久九九九女人毛片 | 日韩精品一区二 | 亚洲午夜视频 |