Pexpect 是 Don Libes 的 Expect 語言的一個 Python 實作,是一個用來啟動子程式,并使用正規表達式對程式輸出做出特定響應,以此實作與其自動互動的 Python 子產品。 Pexpect 的使用範圍很廣,可以用來實作與 ssh、ftp 、telnet 等程式的自動互動;可以用來自動複制軟體安裝包并在不同機器自動安裝;還可以用來實作軟體測試中與指令行互動的自動化。
一、安裝Pexpect
1、安裝python軟體包管理器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code>[root@plinuxos ~]</code><code># yum install -y python34-setuptools </code>
<code>Loaded plugins: fastestmirror</code>
<code>Loading mirror speeds from cached hostfile</code>
<code> </code><code>* base: mirrors.btte.net</code>
<code> </code><code>* epel: mirrors.ustc.edu.cn</code>
<code> </code><code>* extras: mirrors.aliyun.com</code>
<code> </code><code>* updates: mirrors.aliyun.com</code>
<code>......</code>
<code>Installed:</code>
<code> </code><code>python34-setuptools.noarch 0:19.2-3.el7</code>
<code>Dependency Installed:</code>
<code> </code><code>python34.x86_64 0:3.4.5-4.el7 python34-libs.x86_64 0:3.4.5-4.el7</code>
<code>Complete!</code>
2、安裝pexpect軟體
<code>[root@plinuxos ~]</code><code># easy_install-3.4 pexpect</code>
<code>Searching </code><code>for</code> <code>pexpect</code>
<code>Reading https:</code><code>//pypi</code><code>.python.org</code><code>/simple/pexpect/</code>
<code>Best match: pexpect 4.2.1</code>
<code>Downloading https:</code><code>//pypi</code><code>.python.org</code><code>/packages/e8/13/d0b0599099d6cd23663043a2a0bb7c61e58c6ba359b2656e6fb000ef5b98/pexpect-4</code><code>.2.1.</code><code>tar</code><code>.gz</code><code>#md5=3694410001a99dff83f0b500a1ca1c95</code>
<code>Processing pexpect-4.2.1.</code><code>tar</code><code>.gz</code>
<code>Installed </code><code>/usr/lib/python3</code><code>.4</code><code>/site-packages/ptyprocess-0</code><code>.5.2-py3.4.egg</code>
<code>Finished processing dependencies </code><code>for</code> <code>pexpect</code>
3、驗證安裝效果
<code>[root@plinuxos ~]</code><code># python3.4</code>
<code>Python 3.4.5 (default, May 29 2017, 15:17:55)</code>
<code>[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux</code>
<code>Type </code><code>"help"</code><code>, </code><code>"copyright"</code><code>, </code><code>"credits"</code> <code>or </code><code>"license"</code> <code>for</code> <code>more</code> <code>information.</code>
<code>>>> </code><code>import</code> <code>pexpect</code>
<code>>>> </code><code>dir</code><code>(pexpect)</code>
<code>[</code><code>'EOF'</code><code>, </code><code>'ExceptionPexpect'</code><code>, </code><code>'Expecter'</code><code>, </code><code>'PY3'</code><code>, </code><code>'TIMEOUT'</code><code>, </code><code>'__all__'</code><code>, </code><code>'__builtins__'</code><code>, </code><code>'__cached__'</code><code>, </code><code>'__doc__'</code><code>, </code><code>'__file__'</code><code>, </code><code>'__loader__'</code><code>, </code><code>'__name__'</code><code>, </code><code>'__package__'</code><code>, </code><code>'__path__'</code><code>, </code><code>'__revision__'</code><code>, </code><code>'__spec__'</code><code>, </code><code>'__version__'</code><code>, </code><code>'exceptions'</code><code>, </code><code>'expect'</code><code>, </code><code>'is_executable_file'</code><code>, </code><code>'pty_spawn'</code><code>, </code><code>'run'</code><code>, </code><code>'runu'</code><code>, </code><code>'searcher_re'</code><code>, </code><code>'searcher_string'</code><code>, </code><code>'spawn'</code><code>, </code><code>'spawnbase'</code><code>, </code><code>'spawnu'</code><code>, </code><code>'split_command_line'</code><code>, </code><code>'sys'</code><code>, </code><code>'utils'</code><code>, </code><code>'which'</code><code>]</code>
<code>>>> print(pexpect.run(</code><code>'w'</code><code>))</code>
<code>b</code><code>' 14:27:41 up 67 days, 1:12, 2 users, load average: 0.00, 0.01, 0.05\r\nUSER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT\r\nroot tty1 23Sep17 38days 0.02s 0.02s -bash\r\nroot pts/0 103.20.249.250 13:55 5.00s 0.14s 0.09s python3.4\r\n'</code>
二、使用pexpect遠端管理裝置
1、建立腳本
<code>[root@plinuxos tmp]</code><code># cat pexpectest.py</code>
<code>import</code> <code>pexpect</code>
<code>import</code> <code>sys</code>
<code>ssh</code><code>=pexpect.spawn(</code><code>'/usr/bin/ssh [email protected].***.***'</code><code>)</code>
<code>ssh</code><code>.expect(</code><code>'password:'</code><code>)</code>
<code>ssh</code><code>.sendline(</code><code>"123456"</code><code>)</code>
<code>ssh</code><code>.expect(</code><code>'#'</code><code>)</code>
<code>ssh</code><code>.sendline(</code><code>"echo 'this is a test'>> /tmp/1.txt"</code><code>)</code>
<code>print(</code><code>ssh</code><code>.before) </code><code># Print the result of the ls command. </code>
<code>ssh</code><code>.interact() </code><code># Give control of the ssh to the user.</code>
2、運作腳本
16
17
18
19
20
21
22
23
24
25
26
27
<code>[root@plinuxos tmp]</code><code># python3.4 pexpectest.py</code>
<code>b</code><code>' \r\n '</code>
<code>#####################################################################</code>
<code> </code><code># Notice #</code>
<code> </code><code># #</code>
<code> </code><code># 1. Please DO NOT upgrade the kernel, as the kernel upgrade would #</code>
<code> </code><code># damage the original operating system. #</code>
<code> </code><code># 2. Please create unique passwords that use a combination of words,#</code>
<code> </code><code># numbers, symbols, and both upper-case and lower-case letters. #</code>
<code> </code><code># Avoid using simple adjacent keyboard combinations such as #</code>
<code> </code><code># "Qwert!234","Qaz2wsx",etc. #</code>
<code> </code><code># 3. Unless necessary, please DO NOT open or use high-risk ports, #</code>
<code> </code><code># such as Telnet-23, FTP-20/21, NTP-123(UDP), RDP-3389, #</code>
<code> </code><code># SSH/SFTP-22, Mysql-3306, SQL-1433,etc. #</code>
<code> </code><code># Any questions please contact 4000-955-988 #</code>
<code> </code><code>######################################################################</code>
<code>[root@pos ~]</code><code># echo 'this is a test'>> /tmp/1.txt</code>
<code>[root@pos ~]</code><code>#</code>
<code>##以上運作腳本後自動輸出</code>
<code>[root@pos ~]</code><code># cat /tmp/1.txt</code>
<code>this is a </code><code>test</code>
<code>[root@pos ~]</code><code># logout</code>
<code>Connection to 122.112.***.*** closed.</code>
本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1978101,如需轉載請自行聯系原作者