【问题标题】:python pexpect will not work with a dynamic valuepython pexpect 不适用于动态值
【发布时间】:2012-06-01 18:16:38
【问题描述】:

所以我有一个程序可以通过 ssh 连接到远程服务器并启动该端的 iperf 服务器。 当它运行时,它将从客户端 iperf 该服务器。

当我静态给出 IP 地址时它工作正常,例如:

        p=pexpect.spawn('ssh -t -x paddy@20.20.20.20 ' + iperf)

但当我使用时不是:

        p=pexpect.spawn('ssh -t -x paddy@'+ADDRESS+' ' + iperf)

我得到一个:

'pexpect.TIMEOUT'

ADDRESS 肯定会正确输入。 有人对出了什么问题有任何想法吗?

    #!/usr/bin/env python
import pexpect
import re
import shutil
import getpass
import struct, fcntl, os, sys, signal, time

def start_Server(iperf, password, ADDRESS):
    ssh_newkey = 'Are you sure you want to continue connecting'
    fix = ADDRESS+' ' + iperf
    p=pexpect.spawn('ssh -t -x paddy@'+ fix)
    i=p.expect([ssh_newkey,'password:',pexpect.EOF,pexpect.TIMEOUT],1)
    if i==0:
        print "I say yes"
        p.sendline('yes')
        i=p.expect([ssh_newkey,'password:',pexpect.EOF])
    if i==1: 


        pwtp = False
        trysout = True
        while pwtp == False:
            trysout = True
            p.sendline(password)
            loginStuff=p.expect(['Permission denied, please try again.','Permission denied (publickey,password).', '------------------------------------------------------------', pexpect.TIMEOUT,pexpect.EOF],1)
            if loginStuff == 0:
                password = getpass.getpass("Please enter "+ADDRESS+"'s Password")
            elif loginStuff == 1:
                print 'Sorry but you faild to login'
                sys.exit(0)
                pwtp = True
                trysout = False
            elif loginStuff == 2:
                pwtp = True
                i=3
            elif loginStuff == 4:
                pwtp = True
                pass
            else:
                pass       

    elif i==2:
        print "I either got key or connection timeout"
        pass
    elif i==4:
        print "I either got key or connection timeout"
        pass
    if i==3: #timeout
        print fix
        print ADDRESS
        print 'we find outselfs in a timeout'
        print i
        pass
    return p, password


def RepresentsInt(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False

var = raw_input("Enter the destination IP address: ")
ADDRESS = var

password = getpass.getpass("Please enter "+ADDRESS+"'s Password")        

t, password = start_Server('iperf -s', password, ADDRESS)

u, password = start_Server('iperf -u -s', password, ADDRESS)
print ADDRESS
p=pexpect.spawn('ssh -t -x paddy@20.20.20.20 iperf -u -s')
ssh_newkey = 'Are you sure you want to continue connecting'
i=p.expect([ssh_newkey,'password:',pexpect.EOF])
if i == 0:
    print ssh_newkey
elif i == 1:
    print 'password:'
elif i == 2:
    print pexpect.EOF
else:
    print 'Sorry what!?'
    print i

【问题讨论】:

  • 什么是iperf 变量? ADDRESS 是什么?
  • 两者都是字符串。 ADDRESS 是 IP 地址和 iperf 字符串,其中包含我希望运行的命令,例如'iperf -s'。
  • 对不起,连接失败:连接被拒绝并且读取失败:连接被拒绝不是来自 ssh。但我得到一个'pexpect.TIMEOUT'
  • 那是相当多的代码。您能否将其简化为一个小的自包含问题,该问题重现您所看到的问题?另外,你能修复你的缩进吗,这在 Python 中非常重要!最后,你能告诉我们ADDRESS是什么吗?!不是用于获取用户输入的代码,而是当您超时时 ADDRESS 的确切值。
  • 可能相关:如果您在第一次被要求确认地址时回答“否”,ADDRESS 永远不会设置为 var

标签: python ssh pexpect


【解决方案1】:

当我将 pexpect ssh 从子例程中取出时,它起作用了。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 2022-01-25
    • 2021-12-20
    • 2015-03-05
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多