如何解决使用pexpect的SSH隧道
我只是想知道这里是否有人仅使用pexpect和默认库构建了ssh隧道?可以从一台远程服务器1(linux)连接到另一台服务器2(linux)到Cisco设备。
我确实有一个工作脚本(使用pexpect的实现类和方法),该脚本可以跳转并连接到server2到Cisco设备并执行特定的linux命令(例如pwd,主机名等)。现在,当我尝试使用其他命令进行操作时从server2到设备的snmpwalk,这就是我遇到以下问题的时间。
问题:
sending line: snmpwalk 10.1.1.1 snmpEngineTime
Traceback (most recent call last):
File "gosnmp.py",line 606,in <module>
c.send('snmpwalk 10.1.1.1 snmpEngineTime')
File "gosnmp.py",line 386,in send
self.ssh_tunnel.expect(['%'],60)
File "/home/<>/atools/SSH_TUNNEL/pexpect.py",line 1311,in expect
return self.expect_list(compiled_pattern_list,timeout,searchwindowsize)
File "/home/<>/atools/SSH_TUNNEL/pexpect.py",line 1325,in expect_list
return self.expect_loop(searcher_re(pattern_list),line 1409,in expect_loop
raise TIMEOUT (str(e) + '\n' + str(self))
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
<pexpect.spawn object at 0xf20590>
version: 2.3 ($Revision: 399 $)
command: /usr/local/bin/ssh
args: ['/usr/local/bin/ssh','<>@1.1.1.1']
searcher: searcher_re:
0: re.compile("%")
e
e
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 507
child_fd: 4
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: <open file 'actualjump.log',mode 'w' at 0xf230c0>
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
代码示例(不完整):
class Connection(object):
# Login-handling
def login_to_domain(self,domain_ip,user,pwd):
logger.debug('login_to_domain %s' % domain_ip)
if self.ssh_tunnel == None:
# for domain 1 let's start the connection
cmd = 'ssh %s@%s' % (user,domain_ip)
logger.debug('cmd: %s' % cmd)
self.ssh_tunnel = pexpect.spawn(cmd)
else:
self.send_line('ssh %s@%s' % (user,domain_ip))
if FULLLOG:
self.ssh_tunnel.logfile = file('actualjump.log','w')
for _ in range(5):
logged_in = self.handle_domain_login(user,pwd)
logger.debug('logged_in: %s' % logged_in)
if logged_in == CONN_SUCCESS:
return True
if logged_in == CONN_FAIL:
return False
else:
logger.warning('A problem logging in domain [%s]! Quitting.' % domain_ip)
return False
return False
def send(self,text):
logger.debug('sending special line: %s' % text)
print 'sending special line: %s' % text
self.ssh_tunnel.send(text)
#self.ssh_tunnel.expect(text)
#self.ssh_tunnel.send('\n')
self.ssh_tunnel.expect(['%'],60)
resxx = self.ssh_tunnel.before + self.ssh_tunnel.after
print "\nresxx:",resxx
c = Connection() # CALL CONNECTION CLASS
try:
D1_IP = domains.get('domains','44')
print "\nYOUR DOMAIN:\n",D1_IP,"\n"
except ConfigParser.NoOptionError:
logger.error('Domain 1 or %s not specified in config file!',args.domain)
raise IOSupgradeException('CMDS domain missing')
try:
usernamex = cfgcred.get('domain login','username')
passwordy = cfgcred.get('domain login','password')
except ConfigParser.NoOptionError:
logger.error('login credentials not found in config file!')
raise IOSupgradeException('login info missing')
try:
tacacs_username = cfgcred.get('tacacs login','username')
tacacs_password = cfgcred.get('tacacs login','password')
print 'cmds %s/%s' % (tacacs_username,tacacs_password)
except ConfigParser.NoOptionError:
logger.error('TACACS login credentials not found in config file!')
raise IOSupgradeException('TACACS login info missing')
print 'connecting to jump server %s' % D1_IP
c.login_to_domain(D1_IP,usernamex,passwordy)
print 'Sending SNMP'
c.send('snmpwalk 10.1.1.1 snmpEngineTime')
注意:不允许安装任何库,例如paramiko / netmiko,它更友好,因此我必须使用长方法创建。
请帮助,或者如果您可以共享一些示例脚本。谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。