WEB开发网
开发学院软件开发Python 探索 Pexpect,第 2 部分:Pexpect 的实例分析 阅读

探索 Pexpect,第 2 部分:Pexpect 的实例分析

 2009-08-29 00:00:00 来源:WEB开发网   
核心提示: 如果调用的函数最终都没有调用 send 或 read_nonblocking,那么 logfile 虽然被分配指定了一个 file,探索 Pexpect,第 2 部分:Pexpect 的实例分析(5),但其最终结果是:内容为空,见下例: 清单 3. log 内容为空的例子代码importpexp

如果调用的函数最终都没有调用 send 或 read_nonblocking,那么 logfile 虽然被分配指定了一个 file,但其最终结果是:内容为空。见下例:

清单 3. log 内容为空的例子代码

import pexpect 
p = pexpect.spawn( ‘ ls -l ’ ) 
fout = open ('log.txt', "w") 
p.logfile = fout 
fout.close() 

运行该脚本后,你会发现其实 log.txt 是空的,没有记录 ls -l 命令的内容,原因是没有调用 send 或 read_nonblocking,真正的内容没有被 flush 到 log 中。如果在 fout.close() 之前加上 p.expect(pexpect.EOF),log.txt 才会有 ls -l 命令的内容。

例 3:ssh 的使用

本例实现了如下功能:ssh 登录到某个用户指定的主机上,运行某个用户指定的命令,并输出该命令的结果。

清单 4. ssh 的例子代码

#!/usr/bin/env python 
 
""" 
This runs a command on a remote host using SSH. At the prompts enter hostname, 
user, password and the command. 
""" 
 
import pexpect 
import getpass, os 
 
#user: ssh 主机的用户名 
#host:ssh 主机的域名 
#password:ssh 主机的密码 
#command:即将在远端 ssh 主机上运行的命令 
def ssh_command (user, host, password, command): 
  """ 
  This runs a command on the remote host. This could also be done with the 
  pxssh class, but this demonstrates what that class does at a simpler level. 
  This returns a pexpect.spawn object. This handles the case when you try to 
  connect to a new host and ssh asks you if you want to accept the public key 
  fingerprint and continue connecting. 
  """ 
  ssh_newkey = 'Are you sure you want to continue connecting' 
  # 为 ssh 命令生成一个 spawn 类的子程序对象. 
  child = pexpect.spawn('ssh -l %s %s %s'%(user, host, command)) 
  i = child.expect([pexpect.TIMEOUT, ssh_newkey, 'password: ']) 
  # 如果登录超时,打印出错信息,并退出. 
  if i == 0: # Timeout 
    print 'ERROR!' 
    print 'SSH could not login. Here is what SSH said:' 
    print child.before, child.after 
    return None 
  # 如果 ssh 没有 public key,接受它. 
  if i == 1: # SSH does not have the public key. Just accept it. 
    child.sendline ('yes') 
    child.expect ('password: ') 
    i = child.expect([pexpect.TIMEOUT, 'password: ']) 
    if i == 0: # Timeout 
    print 'ERROR!' 
    print 'SSH could not login. Here is what SSH said:' 
    print child.before, child.after 
    return None 
  # 输入密码. 
  child.sendline(password) 
  return child 
 
def main (): 
  # 获得用户指定 ssh 主机域名. 
  host = raw_input('Hostname: ') 
  # 获得用户指定 ssh 主机用户名. 
  user = raw_input('User: ') 
  # 获得用户指定 ssh 主机密码. 
  password = getpass.getpass() 
  # 获得用户指定 ssh 主机上即将运行的命令. 
  command = raw_input('Enter the command: ') 
  child = ssh_command (user, host, password, command) 
  # 匹配 pexpect.EOF 
  child.expect(pexpect.EOF) 
  # 输出命令结果. 
  print child.before 
 
if __name__ == '__main__': 
  try: 
    main() 
  except Exception, e: 
    print str(e) 
    traceback.print_exc() 
    os._exit(1)

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:探索 Pexpect 部分

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接