【问题标题】:How do I get a line of the what the console returns (string) and place in a variable?如何获取控制台返回的内容(字符串)并放入变量中?
【发布时间】:2013-04-26 19:49:27
【问题描述】:

我的代码使用 telnet 并且需要登录。如果登录不正确,则向控制台返回“登录不正确”。我想捕捉这个异常并跳过它,这样它就不会停止程序。我试过的如下:

try:
    session.write("username".encode('ascii') + b"\r")
    session.write("password".encode('ascii') + b"\r")
    ***this is the point where the console will return "Incorrect login"***
except sys.stdout == "Incorrect login":
    print(sys.stdout)
    pass
else:
    **Rest of the code**

似乎它永远不会捕获此输出,继续执行我的代码并最终导致索引错误(因为我没有登录所需的数据)。我尝试搜索但没有运气。任何帮助,将不胜感激。我正在运行 python 3.3,并且仍在学习。谢谢!

编辑:这是 telnet 显示的内容

login: badusername
password: **blank b/c it is a pw field**
Login incorrect

login: 

Edit2:直到 else 的所有代码(为保密而编辑)

import telnetlib, time
import sys, string, socket
import cx_Oracle

sql = "select column from table" 
con = cx_Oracle.connect("login info blah...")
cur = con.cursor()
cur.execute(sql)
row = cur.fetchone()
rows = cur.fetchall()

def Tup():
    return (rows)

cur.close()
con.close()

i = 0

while i < len(rows):   
    host    = Tup()[i][0]
    timeout = 120
    print(host + ' =', end = ' ')
    try:
        session = telnetlib.Telnet(host, 23, timeout)
    except:
        out = open("Data.txt",'a')
        out.write(host + " = FAILED\n")
        print("FAILED")
    else:        
    try:
        session.write("username".encode('ascii') + b"\r")
        session.write("pass".encode('ascii') + b"\r")
    except sys.stdout == "Incorrect login":
        print(sys.stdout)
        pass
    else:

【问题讨论】:

  • try 块中引发的异常是什么? except 正在寻找 0+ Exception 对象,而不是比较
  • 我想我可能有错误的方法。也不例外,它只是返回“不正确的登录”,我想跳过该案例的其余部分..
  • 在这种情况下使用 if ... == 'Incorrect login': else
  • 这是我最初的想法,但我不知道要分配给...我不知道如何从控制台中提取该字符串,因为它是从我连接的机器返回的。
  • 你能把所有相关的代码从头到尾粘贴到else吗?所以我们可以尝试一下并了解模块等。

标签: python python-3.x try-catch stdout sys


【解决方案1】:
username = input("Enter user name")
password = input("Enter password")

try:
    session.write(str(username).encode('ascii') + b"\r")
    session.write(str(password).encode('ascii') + b"\r")
    ***this is the point where the console will return "Incorrect login"***
except Exception as e:
    print "exception raised"
    pass
else:
    **Rest of the code**

【讨论】:

    【解决方案2】:

    查看[subprocess][1] 模块,它包含一个check_output 方法,该方法将执行命令的输出作为字符串返回。

    试试这个。您可能需要更改一些语法细节...

    PROMPT = '$' # or '#' or '%', the shell prompt
    TIMEOUT = 3
    
    try:
        session.read_until(b"login:")
        session.write("username".encode('ascii') + b"\r")
    
        session.read_until(b"password:")
        session.write("password".encode('ascii') + b"\r")
        login_result = session.read_until(PROMPT, TIMEOUT) # This will make it put whatever is printed till PROMPT into login_result. if it takes more than TIMEOUT seconds, you can assume login failed (since PROMPT never came up)
        ***this is the point where the console will return "Incorrect login"***
    
        if(login_result[-1] != PROMPT):    # change this -1 to -2 or -3 if the output is trailed by a newline
            raise Exception
    
    except Exception:
        print("Login Failure")
        pass
    
    else:
        **Rest of the code**
    

    【讨论】:

    • 是的,我正在使用 telnet。会议就是这样。子流程将如何工作。如果可能的话,我正在寻找简短而甜蜜的东西。
    • 这似乎让我走上了正轨。如果我得到它,我会将其标记为解决方案。谢谢!
    【解决方案3】:

    如果您查看 python 'telnetlib.py' 代码,您会看到一个名为 'expect()' 的方法。你可以试试看它是否能帮助你完成工作。请记住,它需要一个正则表达式列表,因此请相应地设计您的搜索字符串。

    由于您使用的是 telnetlib,如果您还没有偶然发现这个技巧(我确实使用了 telnetlib 很长时间而没有注意到它),请尝试将 telnet.debuglevel 设置为非零。它可以帮助您窥探低级别的数据流量。

    编辑:

    嗯,我发现自己有一些时间,所以我能够创建和测试一些演示代码。首先,要知道,作为初学者,您选择通过玩 telnetlib 并期望潜入编码池的“更深”端。它们并不难,但由于 telnet 的奥秘和屏幕抓取的“艺术”,它们很乏味。不适合心脏弱者。

    所以这是我的剪辑。我在我们的一台本地服务器上对此进行了测试,并且能够更改为无效密码以验证代码确实检测到“登录失败”情况。您很可能需要为您的应用程序调整此代码。

    #!/usr/bin/python3
    
    import telnetlib
    
    TARGET_NAME = "<insert yours here>"
    USER_NAME   = "<insert yours here>"
    USER_PW     = "<insert yours here>"
    
    session = telnetlib.Telnet(host=TARGET_NAME)
    
    session.debuglevel = 1
    
    session.write("\n\n".encode('ascii'))
    
    index, match_obj, text = session.expect(["login: ".encode('ascii')])
    if match_obj:
        print("DBG: Sending user name")
        session.write((USER_NAME + '\r').encode('ascii'))
    
    index, match_obj, text = session.expect(["Password:".encode('ascii')])
    if match_obj:
        print("DBG: Sending password")
        session.write((USER_PW + '\r').encode('ascii'))
    
    
    print("Checking for failed login")
    index, match_obj, text = session.expect(["Login incorrect".encode('ascii')], timeout=3)
    
    if match_obj:
        print("Login failed")
    else:
        print("Well, at least we didn't see, 'Login failed'")
    

    为了更好地理解这里发生了什么,请查看 telnetlib 源代码。您会注意到,expect() 方法返回三个值:找到文本的位置的索引、匹配对象和到该点读取的文本。我利用了以前的正则表达式经验,匹配对象将根据是否找到匹配来评估为布尔值。您可能希望使用返回值的其他组合来确定 expect 调用到底找到了什么。同样,乏味,但并不困难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      相关资源
      最近更新 更多