我的代码使用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:所有代码最多为其他(为保密而编辑)
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:
答案 0 :(得分: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**
答案 1 :(得分:0)
如果您查看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()方法返回三个值:找到文本的位置索引,匹配对象和读取到该点的文本。我利用之前的正则表达式经验,匹配对象将根据是否找到匹配来评估布尔值。您可能希望使用返回值的某些其他组合来确定期望调用的确切内容。再次,乏味,但并不困难。
答案 2 :(得分:-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**