1. 程式人生 > >用Pexpect與SSH互動(實現了引數化輸入以及命令列shell互動的形式)

用Pexpect與SSH互動(實現了引數化輸入以及命令列shell互動的形式)

#!/usr/bin/python  
#coding=utf-8  
import pexpect  
from optparse import OptionParser  
  
#SSH連線成功時的命令列互動視窗中的提示符的集合  
PROMPT = ['# ','>>> ','> ','\$ ']  
  
def send_command(child,cmd):  
    #傳送一條命令  
    child.sendline(cmd)  
  
    #期望有命令列提示字元出現  
    child.expect(PROMPT)  
  
    #將之前的內容都輸出  
    print child.before.split('\n')[1]  
  
def connect(user,host,password):  
    #表示主機已使用一個新的公鑰的訊息  
    ssh_newkey = 'Are you sure you want to continue connecting'  
    connStr = 'ssh ' + user + '@' + host  
  
    #為ssh命令生成一個spawn類的物件  
    child = pexpect.spawn(connStr)  
  
    #期望有ssh_newkey字元、提示輸入密碼的字元出現,否則超時  
    ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])  
  
    #匹配到超時TIMEOUT  
    if ret == 0:  
        print '[-] Error Connecting'  
        return  
  
    #匹配到ssh_newkey  
    if ret == 1:  
        #傳送yes迴應ssh_newkey並期望提示輸入密碼的字元出現  
        child.sendline('yes')  
        ret = child.expect([pexpect.TIMEOUT,ssh_newkey,'[P|p]assword: '])  
  
    #匹配到超時TIMEOUT  
    if ret == 0:  
        print '[-] Error Connecting'  
        return  
  
    #傳送密碼  
    child.sendline(password)  
    child.expect(PROMPT)      
    return child  
  
def main():  
    parser = OptionParser("[*] Usage : ./sshCommand2.py -H <target host> -u <username> -p <password>")  
    parser.add_option('-H',dest='host',type='string',help='specify target host')  
    parser.add_option('-u',dest='username',type='string',help='target username')  
    parser.add_option('-p',dest='password',type='string',help='target password')  
    (options,args) = parser.parse_args()  
  
    if (options.host == None) | (options.username == None) | (options.password == None):  
        print parser.usage  
        exit(0)  
  
    child=connect(options.username,options.host,options.password)  
      
    while True:  
        command = raw_input('<SSH> ')  
        send_command(child,command)  
  
if __name__ == '__main__':  
    main()