Expect 程序主要用於人機對話的模擬,就是那種系統提問,人來回答 yes/no ,或者賬號登錄輸入用戶名和密碼等等的情況。因為這種情況特別多而且繁瑣,所以很多語言都有各種自己的實現。
最初的第一個 Expect 是由 TCL 語言實現的,所以后來的 Expect 都大致參考了最初的用法和流程。
pexpect 是 Python 語言的類 Expect 實現。pxssh模塊用於在python中ssh遠程連接,執行命令,返回結果,但注意不支持Windows系統。
例一
1 #!/usr/bin/env python 2 3 #-*- coding:utf-8 -*- 4 5 from pexpect import pxssh 6 7 host = "172.16.1.15" 8 username = "root" 9 password = "123456" 10 cmd1 = "ifconfig" 11 cmd2 = "uptime" 12 13 try: 14 s = pxssh.pxssh() #實例化一個對象 15 s.login(host,username,password) #登錄 16 17 s.sendline(cmd1) #執行命令 18 s.prompt() #匹配cmd1執行后的下一步操作的命令提示符 19 print s.before #輸出命令提示符之前的內容 20 21 s.sendline(cmd2) 22 s.prompt() #s.prompt()按順序匹配命令提示符,即如果注釋上一個s.prompt(),這次會匹配cmd1執行后的命令提示符,s.before也只會輸出cmd1返回的結果 23 print s.before #s.before指的是兩個命令提示符之間的內容,即如果注釋上一個print s.before,這次也只會輸出cmd2返回的結果,而不是cmd1+cmd2的內容 24 25 s.logout() #登出 26 27 except : 28 print "pxssh failed on login."
例二
#!/usr/bin/python #coding:utf-8 from pexpect.pxssh import pxssh class SSH: def __init__(self): pass def connect(self, ip, user='root', password='zx123456'): self.ssh = pxssh() try: self.ssh.login(ip, user, password) return True except Exception as e: import sys print(sys.exc_info()) return False def execute(self,command): CR = '\r\n' self.ssh.sendline(command) # 執行命令 self.ssh.prompt() # 匹配command執行后的下一步操作的命令提示符 # self.ssh.before 指的是兩個命令提示符之間的內容 data = (self.ssh.before).split(CR.encode('utf-8'))[1:-1] for each in data: print(each.decode('utf-8'))
>>> from ssh import SSH >>> H1 = SSH() >>> H1.connect('192.168.11.171') # ssh連接到11.171 True >>> H1.execute('pwd') # 在11.171上執行pwd命令 /root
