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