아래 클래스는 명령을 실행하고 구성 요소를 업데이트하기 위해 cisco와 같은 장치 인터페이스를 조작하도록 설계되었습니다.pexpect 및 'chained'함수 호출의 문제점
현재로서는 클래스를 인스턴스화하고 ssh_to_aos_expsh
함수를 호출하고 올바른 출력을 얻을 수 있습니다 (예 : 명령이 'show running-config'일 때 구성 가져 오기). 그러나 ssh_to_aos_expsh
함수를 호출하는 ssh_to_aos_config
함수를 호출하면 pexpect 시간 초과 오류가 발생합니다.
ssh_toaos_config
에
ssh_to_aos_expsh
에 의해 반환 된 객체에
ssh_to_aos_expsh
에
_ssh_connect
에 의해 반환합니다 (
_ssh_connect
,
ssh_to_aos_expsh
및
ssh_to_aos_config
의 '아동')이 pexpect 개체를 비교했는데이 같은 메모리 위치에 나타납니다, 그래서
I pexpect로 오브젝트를 계속 조작 할 수없는 이유가 명확하지 않습니다.
필자는 가장 정교한 파이썬 코더가 아니므로 기능간에 pexpect 오브젝트를 전달하려고 시도하는 중에 의도하지 않은 실수를 한 것일 수 있습니다. 그렇다면 누군가 내 실수를 지적 해 주시면 감사하겠습니다.
#!/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 = "[email protected]%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
사실, _ssh_connect가 호출되면 self.root_prompt가 설정됩니다. 연결되는 각 장치마다 루트 프롬프트가 다르므로 동적으로 빌드해야합니다. _ssh_connect에 들여 쓰기 문제가 수정되었습니다. 텍스트를 붙여 넣은 방법의 인공물이었습니다. –