用Pexpect與SSH互動(實現了引數化輸入以及命令列shell互動的形式)
阿新 • • 發佈:2019-01-11
#!/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()