天天看點

Python子產品之pexpect

pexpect是一個用來啟動子程式并對其進行自動控制的 Python 子產品。

pexpect 可以用來和像 ssh、passwd、telnet 、rsync等指令行程式進行自動互動

下面是我用pexpect寫的一個腳本,是用來執行遠端主機指令,腳本是自動互動輸入遠端主機的密碼的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

<code># encoding: utf-8</code>

<code>#filename:python_rsync.py</code>

<code>__author__ </code><code>=</code> <code>"ZhouLS"</code>

<code>#同要用來同步遠端主機上的日志檔案到本地。</code>

<code>import</code> <code>pexpect</code>

<code>import</code> <code>os,sys</code>

<code>import</code> <code>time</code>

<code>#遠端主機位址</code>

<code>Dir</code> <code>=</code> <code>"/usr/local/tomcat48080/webapps/WebApi_Develop/logs"</code>

<code>#本地主機位址</code>

<code>Ldir </code><code>=</code> <code>"./logs/"</code>

<code>#遠端主機清單,主機:密碼 #也可自己定義其他方式,</code>

<code>hosts </code><code>=</code> <code>[</code><code>'192.168.20.20:redhat'</code><code>,</code><code>'192.168.20.22:redhat'</code><code>]</code>

<code>#</code>

<code>#定義一個同步檔案的方法</code>

<code>def</code> <code>rsync(sfile):</code>

<code>    </code><code>#使用for循環取出遠端主機和密碼,并執行相應的遠端指令,自動送出密碼</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>hosts:</code>

<code>        </code><code>hostname </code><code>=</code> <code>i.split(</code><code>':'</code><code>)[</code><code>0</code><code>]</code>

<code>        </code><code>passwd </code><code>=</code> <code>i.split(</code><code>':'</code><code>)[</code><code>1</code><code>]</code>

<code>        </code><code>sfile </code><code>=</code> <code>os.path.join(</code><code>Dir</code><code>,sfile)</code>

<code>        </code><code>dfile </code><code>=</code> <code>os.path.join(Ldir,hostname)</code>

<code>        </code><code>#cmd指令可以修改為自己的指令,自己發揮,我用的rsync指令同步檔案的。</code>

<code>        </code><code>cmd </code><code>=</code> <code>"""rsync -azv root@%s:%s %s"""</code> <code>%</code> <code>(hostname,sfile,dfile)</code>

<code>        </code><code>print</code> <code>cmd</code>

<code>        </code> 

<code>        </code><code>#下面是自動互動程式</code>

<code>        </code><code>ssh </code><code>=</code> <code>pexpect.spawn(cmd, [], </code><code>86400</code><code>)</code>

<code>        </code><code>try</code><code>:</code>

<code>            </code><code>while</code> <code>True</code><code>:</code><code>#使用一個循環來進入互動式</code>

<code>                </code><code>i </code><code>=</code> <code>ssh.expect([</code><code>'assword: '</code><code>, </code><code>'continue connecting (yes/no)?'</code><code>]) </code><code>#接收互動的提示</code>

<code>                </code><code>if</code> <code>i </code><code>=</code><code>=</code> <code>0</code><code>: </code><code>#如果是assword:直接發送密碼,并跳出循環</code>

<code>                    </code><code>ssh.sendline(passwd)</code>

<code>                    </code><code>break</code>

<code>                </code><code>elif</code> <code>i </code><code>=</code><code>=</code> <code>1</code><code>:</code><code>#如果提示的是yes/no)?直接發送yes并繼續下一個循環</code>

<code>                    </code><code>ssh.sendline(</code><code>'yes'</code><code>)</code>

<code>        </code><code>except</code> <code>pexpect.EOF:</code>

<code>            </code><code>ssh.close</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>ssh.expect(pexpect.EOF)</code>

<code>            </code><code>ssh.close()</code>

<code>            </code> 

<code>        </code><code>print</code> <code>"Done"</code>

<code>#測試程式</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>rsync(</code><code>'command.log.2015-07-13'</code><code>)</code>

以上腳本是同步檔案,也可以修改下執行遠端指令。

也可以把主機清單變一下,寫在一個配置檔案中,也可以對主機進行分組,實作批量管理遠端主機。

大多數的自動化運維工具在批量管理主機上也是大緻相似的原理,是以可以根據自己的需要實作自己的遠端管理工具

上面的腳本也可以實作多線程運作,這個就需要大家自己探索了,我這裡已實作。

本文轉自 ZhouLS 51CTO部落格,原文連結:http://blog.51cto.com/zhou123/1747186