Python 使用pexpect的SSH隧道

Python 使用pexpect的SSH隧道,python,ssh,ssh-tunnel,pexpect,Python,Ssh,Ssh Tunnel,Pexpect,我只是想知道这里是否有人只使用pexpect和默认库构建了ssh隧道?它可以从一个远程服务器1(linux)连接到另一个服务器2(linux)并连接到Cisco设备 我确实有一个工作脚本(使用pexpect实现类和方法),它可以跳转并连接到server2到Cisco设备,并执行特定的linux命令,如pwd、hostname等。现在,当我尝试使用不同的命令,如从server2到设备执行snmpwalk时,我就遇到了下面的问题 问题: sending line: snmpwalk 10.1.1.1

我只是想知道这里是否有人只使用pexpect和默认库构建了ssh隧道?它可以从一个远程服务器1(linux)连接到另一个服务器2(linux)并连接到Cisco设备

我确实有一个工作脚本(使用pexpect实现类和方法),它可以跳转并连接到server2到Cisco设备,并执行特定的linux命令,如pwd、hostname等。现在,当我尝试使用不同的命令,如从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), timeout, searchwindowsize)
  File "/home/<>/atools/SSH_TUNNEL/pexpect.py", 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
注意:不允许安装像paramiko/netmiko这样更友好的库,所以我必须用一个长方法创建


请提供帮助或分享一些示例脚本。谢谢

您如何“不被允许”安装paramiko?这并不是说你需要权限才能写
/usr
或其他任何东西;你可以把它放在任何你有写权限的地方,并适当地调整PYTHONPATH…无论如何,这只是一个旁白;这个问题的真正问题是它的广度——正如目前所写的,它不是问如何解决您遇到的特定问题,而是如何使您的整个程序工作。您如何“不被允许”安装paramiko?这并不是说你需要权限才能写
/usr
或其他任何东西;你可以把它放在任何你有写权限的地方,并适当地调整PYTHONPATH…无论如何,这只是一个旁白;这个问题的真正问题是它的广度——正如目前所写的,它不是问你如何解决你遇到的特定问题,而是如何让你的整个程序工作。
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')