繁体   English   中英

Python Telnet脚本

[英]Python Telnet script

多亏了Python库,我得以使用他们的示例远程登录到Cisco交换机,因此我将其用于学习目的,特别是学习python。

但是,尽管所有代码看起来通常都很容易阅读,但是我对以下内容有些困惑:

1-为什么要使用下面的if语句2-为什么要在用户名和密码写方法之后使用“ \\ n” 3-当更改实际上已提交并成功时,为什么我在bash终端上没有得到输出

HOST = "172.16.1.76"
user = raw_input("Enter your Telnet username : ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST) 

tn.read_until("Username: ") 
tn.write(user + '\n')                <----- 2
if password:                         <----- 1
    tn.read_until("Password: ")
    tn.write(password + "\n")        <------2
tn.write("show run \n") 

time.sleep(5)



output = tn.read_all()              <----- 3
print output  

print "=" * 30
print "Configuration Complete."

我不确定为什么要使用上述if语句,通常在输入用户名后,随后便会出现密码提示。 为什么我们不能输入:

tn.read_until("Username: ") 
tn.write(user + '\n')
tn.read_until("Password: ")
tn.write(password + "\n")

关于第二点,如果我们在添加了密码和用户名后仍要按Enter键,为什么还要在密码和用户名后使用'\\ n'?

1:线

password = getpass.getpass()

询问您密码,如果您将其保留为空,则密码将包含空字符串,该字符串在if语句中与False相同
该脚本不会提前知道您是否在服务器上输入了密码,它会先询问您来模拟知道,如果您没有输入任何内容,它将假定您没有输入密码(否则它将卡在tn.read_until("Password: ")永远。

2: '\\n'模拟您按下返回键。 当您输入密码时,例如'password<RETURN>' ,变量密码将不包含结尾的换行符(\\ n),这就是为什么要手动附加它的原因

3:这个我不知道,可能5秒还不够时间等待

执行tn = telnetlib.Telnet(HOST)之后,您已经创建了从计算机到HOST的telnet通道。 但是您仍然需要与HOST进行通信以推送/发送命令并接收输出。

要将命令推送到主机,您需要执行tn.write(“ your_commands_or_input \\ n”),\\ n表示换行/返回,它告诉您当前需要执行的命令。 执行后,HOST返回结果,该结果将由您的telnet对象“ tn”捕获并保存在其“本地缓存”中,如果期望关键字,则可以使用tn.read_until方法搜索此缓存中期望的任何关键字。已经找到,read_until将停止(总是在找到的第一个停止),您可以做所需的任何事情(现在轮到您了),否则read_until将继续等待HOST的输出(您尚未转动)。 最后,如果要检查是否已缓存所有输出,则可以执行tn.read_all()。

记住一些使用不同登录输出的主机,即用户名vs用户名或密码vs密码,最好使用正则表达式来匹配它们。

github上有一个python库,专门用于telnet到cisco设备。

pip install git+https://github.com/sergeyzelyukin/cisco-telnet.git

import ciscotelnet
with ciscotelnet.CiscoTelnet(host, verbose = False) as cisco:
  if cisco.login(final_mode=CiscoTelnet.MODE_ENABLE, user="john", user_pass="12345678", enable_pass="cisco"):
  # if cisco.login(final_mode=CiscoTelnet.MODE_ENABLE, line_pass="abcdef", enable_pass="cisco"):
    print cisco.cmd("sh int status | inc Fa0/1") 
    print cisco.conf(["interface fast0/1", "descr blank", "load-interval 300"])  
    print cisco.wr() 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM