使用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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...