天天看點

python pexpect

<code>Python 遠端批量修改密碼腳本</code>

<code>#tar -zxvf pexpect-3.0.tar.gz</code>

<code>#cd pexpect-3.0</code>

<code>#python setup.py install</code>

<code>#!/usr/bin/env python</code>

<code>#coding:utf8</code>

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

<code>import</code> <code>sys </code>

<code>iplist </code><code>=</code> <code>[</code><code>'192.168.140.142'</code><code>,</code><code>'192.168.140.145'</code><code>] </code><code>##定義主機清單</code>

<code>oldpasswd </code><code>=</code> <code>'234567'</code> <code>##舊密碼</code>

<code>newpasswd </code><code>=</code> <code>'1234567'</code> <code>##新密碼</code>

<code>while</code> <code>iplist:</code>

<code>    </code><code>ip </code><code>=</code> <code>iplist[</code><code>-</code><code>1</code><code>] </code><code>##擷取一個IP</code>

<code>    </code><code>iplist.pop() </code><code>##清單去掉一個值</code>

<code>    </code><code>child </code><code>=</code> <code>pexpect.spawn(</code><code>'ssh root@'</code><code>+</code><code>ip) </code><code>##定義觸發</code>

<code>    </code><code>fout </code><code>=</code> <code>file</code><code>(</code><code>'passlog.txt'</code><code>,</code><code>'a'</code><code>) </code><code>##定義日志檔案,</code>

<code>    </code><code>child.logfile </code><code>=</code> <code>fout</code>

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

<code>        </code><code>while</code> <code>True</code><code>:</code>

<code>            </code><code>index </code><code>=</code> <code>child.expect([</code><code>'(yes/no)'</code><code>,</code><code>'(?i)password:'</code><code>])</code>

<code>            </code><code>if</code> <code>index </code><code>=</code><code>=</code> <code>0</code><code>:</code>

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

<code>            </code><code>elif</code> <code>index </code><code>=</code><code>=</code> <code>1</code><code>:</code>

<code>                </code><code>child.sendline(oldpasswd)</code>

<code>                </code><code>child.expect(</code><code>'#'</code><code>)</code>

<code>                </code><code>child.sendline(</code><code>'echo  '</code><code>+</code><code>newpasswd</code><code>+</code><code>' | passwd --stdin root'</code><code>)</code>

<code>                </code><code>child.sendline(</code><code>'exit'</code><code>)</code>

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

<code>        </code><code>print</code> <code>&gt;&gt;sys.stderr, ip</code><code>+</code><code>' timeout'</code>

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

<code>        </code><code>print</code> <code>&gt;&gt;sys.stderr, ip</code><code>+</code><code>' &lt;the end&gt;'</code>

<code>(</code><code>1</code><code>)spawn類</code>

<code> </code><code>class</code> <code>pexpect.spawn(command,args</code><code>=</code><code>[],timeout</code><code>=</code><code>30</code><code>,maxread</code><code>=</code><code>2000</code><code>,searchwidowsize</code><code>=</code><code>None</code>

<code>,logfile</code><code>=</code><code>None</code><code>,cwd</code><code>=</code><code>None</code><code>,env</code><code>=</code><code>None</code><code>,ignore_sighup</code><code>=</code><code>True</code><code>)</code>

<code>(</code><code>2</code><code>)run函數</code>

<code>pexpect.run(command,timeout</code><code>=</code><code>-</code><code>1</code><code>,withexitstatus</code><code>=</code><code>False</code><code>,events</code><code>=</code><code>None</code><code>,extra_args</code><code>=</code><code>None</code><code>,</code>

<code>logfile</code><code>=</code><code>None</code><code>,cwd</code><code>=</code><code>None</code><code>,env</code><code>=</code><code>None</code><code>).</code>

<code>(</code><code>3</code><code>)pxssh類</code>

<code>class</code> <code>pexpect.pxssh.pxssh(timeout</code><code>=</code><code>30</code><code>,maxread</code><code>=</code><code>2000</code><code>,searchwidowsize</code><code>=</code><code>None</code><code>,logfile</code><code>=</code><code>None</code><code>,</code>

<code>cwd</code><code>=</code><code>None</code><code>,env</code><code>=</code><code>None</code><code>)</code>

<code>pxssh常用的三個方法:</code>

<code>    </code><code>login()建立連接配接;</code>

<code>    </code><code>logout()斷開連接配接;</code>

<code>    </code><code>prompt()等待系統提示符,用于等待指令執行結束</code>

<code>#!/usr/bin/python# encoding=utf-8# Filename: pexpect_test.pyimport pexpectdef sshCmd(ip, passwd, cmd):</code>

<code>    </code><code>ret </code><code>=</code> <code>-</code><code>1</code>

<code>    </code><code>ssh </code><code>=</code> <code>pexpect.spawn(</code><code>'ssh root@%s "%s"'</code> <code>%</code> <code>(ip, cmd))    </code><code>try</code><code>:</code>

<code>        </code><code>i </code><code>=</code> <code>ssh.expect([</code><code>'password:'</code><code>, </code><code>'continue connecting(yes/no)?'</code><code>], timeout</code><code>=</code><code>5</code><code>)        </code><code>if</code> <code>i </code><code>=</code><code>=</code> <code>0</code><code>:</code>

<code>            </code><code>ssh.sendline(passwd)        </code><code>elif</code> <code>i </code><code>=</code><code>=</code> <code>1</code><code>:</code>

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

<code>            </code><code>ssh.expect(</code><code>'password:'</code><code>)</code>

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

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

<code>        </code><code>r </code><code>=</code> <code>ssh.read()        </code><code>print</code> <code>r</code>

<code>        </code><code>ret </code><code>=</code> <code>0</code>

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

<code>        </code><code>ret </code><code>=</code> <code>-</code><code>1</code>

<code>    </code><code>except</code> <code>pexpect.TIMEOUT:        </code><code>print</code> <code>"TIMEOUT"</code>

<code>        </code><code>ret </code><code>=</code> <code>-</code><code>2</code>

<code>    </code><code>finally</code><code>:</code>

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

<code>sshCmd(</code><code>'xxx.xxx.xxx.xxx'</code><code>,</code><code>'xxxxxx'</code><code>,</code><code>'ls /root'</code><code>)</code>

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1827747,如需轉載請自行聯系原作者