1. 程式人生 > >python終端模擬工具pexpect

python終端模擬工具pexpect

原文:https://my.oschina.net/yongqing/blog/290679

 

Pexpect是一個純Python模組。 可以用來和ssh、ftp、passwd、telnet 等命令列程式進行自動互動。實現與命令列互動的自動化.

它提供了兩個主要介面 run()函式和spawn類.

run()函式

run功能相對簡單,只能實現簡單互動

run(command,timeout=-1,withexitstatus=False,events=None,extra_args=None, logfile=None, cwd=None, env=None)

 

run執行命令,然後返回結果,與os.system類似.

示例

pexpect.run('ls -la')
# 返回值(輸出,退出狀態)
(command_output, exitstatus) = pexpect.run('ls -l /bin', withexitstatus=1)

 

spawn類

spawn功能比run強大,可以實現更復雜互動

class spawn 
    __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None)

 

timeout指定互動是等待的超時值

maxread設定read buffer大小. 每次pexpect嘗試從TTY(Teletype終端)從讀取的最大位元組數.

searchwindowsize 指定了從輸入緩衝區中進行模式匹配的位置,預設從開始匹配.

logfile 引數指定日誌的記錄位置

工作過程

# 第一步與終端建立連線
child = pexpect.spawn('scp foo [email protected]:.')
# 第二步等待終端返回特定內容
child.expect('Password:')
# 第三步根據返回內容傳送命令進行互動
child.sendline(mypassword)

 

pxssh類

pxssh是pexpect的派生類,用於建立ssh連線,比pexpect好用.

login()  建立到目標機器的ssh連線

logout() 釋放該連線

prompt() 等待提示符,通常用於等待命令執行結束

工作過程與pexpect相同

 

# 初始化pxssh示例
s = pxssh.pxssh() 

hostname = raw_input('hostname: ') 
username = raw_input('username: ') 
password = getpass.getpass('password: ') 
# 建立ssh連線
s.login (hostname, username, password) 
# 傳送命令到遠端終端
s.sendline ('uptime') # run a command 
# 等待遠端終端返回
s.prompt() # match the prompt 
# 列印匹配到的內容
print s.before  # print everything before the propt. 

# 傳送命令到遠端終端
s.sendline ('ls -l') 
# 等待遠端終端返回
s.prompt() 
# 列印匹配到的內容
print s.before 

s.sendline ('df') 
s.prompt() 
print s.before 

# 釋放ssh連線
s.logout()