回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>下面的类被设计用来操作类似cisco的设备接口,以执行命令和更新配置元素。在</p>
<p>按照目前的情况,我可以实例化该类,调用<code>ssh_to_aos_expsh</code>函数并返回有效输出(例如,当命令为“show running config”时获取配置)。但是,当我调用<code>ssh_to_aos_config</code>函数(它调用<code>ssh_to_aos_expsh</code>函数)时,我得到一个pexpect超时错误。在</p>
<p>我将<code>_ssh_connect</code>返回的pexpect对象(<code>_ssh_connect</code>、<code>ssh_to_aos_expsh</code>和{<cd2>}中的“child”)与<code>ssh_to_aos_expsh</code>返回的对象进行了比较,并且它似乎位于同一内存位置,所以我不清楚为什么我不能继续使用pexpect操作该对象。在</p>
<p>我不是最复杂的python代码编写者,所以在尝试在函数之间传递pexpect对象时可能犯了一些不经意的错误,如果是这样的话,我希望有人指出我的错误。在</p>
<pre><code>#!/usr/bin/env python
import os
import traceback
import pexpect
class SSHTool():
def __init__(self):
self.aos_user = 'some_user'
self.aos_passwd = 'some_passwd'
self.aos_init_prompt = 'accelerator>'
self.aos_enable_prompt = 'accelerator#'
self.aos_lnxsh_prompt = 'ACC#'
self.linux_passwd = 'linux_passwd'
self.root_prompt = ''
def _timeout_error(self, child):
print 'SSH could not login. Timeout error.'
print child.before, child.after
return None
def _password_error(self, child):
print 'SSH could not login. Password error.'
print child.before, child.after
return None
def _ssh_connect(self, user, address, passwd):
self.root_prompt = "root@%s's password: " % address
ssh_newkey = "Are you sure you want to continue connecting"
child = pexpect.spawn('ssh -l %s %s' % (user, address))
i = child.expect([pexpect.TIMEOUT, \
ssh_newkey, \
'Password: ', \
self.root_prompt])
if i == 0: # Timeout
return self._timeout_error(child)
elif i == 1: # SSH does not have the public key. Just accept it.
child.sendline ('yes')
i = child.expect([pexpect.TIMEOUT, \
'Password: ', \
self.root_prompt])
if i == 0: # Timeout
return self._timeout_error(child)
else:
child.sendline(passwd)
return child
elif i == 2 or i == 3:
child.sendline(passwd)
return child
else:
return self._password_error(child)
def ssh_to_aos_expsh(self, ip_address, command = ''):
child = self._ssh_connect(self.aos_user, \
ip_address, \
self.aos_passwd)
i = child.expect([pexpect.TIMEOUT, \
self.aos_init_prompt])
if i == 0:
return self._timeout_error(child)
child.sendline('enable')
i = child.expect([pexpect.TIMEOUT, \
self.aos_enable_prompt])
if i == 0:
return self._timeout_error(child)
if command:
child.sendline(command)
i = child.expect([pexpect.TIMEOUT, \
self.aos_enable_prompt])
if i == 0:
return self._timeout_error(child)
else:
return child.before
else:
return child
def ssh_to_aos_config(self, ip_address, command):
child = self.ssh_to_aos_expsh(ip_address)
i = child.expect([pexpect.TIMEOUT, \
self.aos_enable_prompt])
if i == 0:
return self._timeout_error(child)
child.sendline('config')
i = child.expect([pexpect.TIMEOUT, \
self.aos_config_prompt])
if i == 0:
return self._timeout_error(child)
child.sendline(command)
i = child.expect([pexpect.TIMEOUT, \
self.aos_config_prompt])
if i == 0:
return self._timeout_error(child)
else:
return child.before
</code></pre>