Python Telnet脚本

Python Telnet脚本,python,python-2.7,automation,cisco-ios,getpass,Python,Python 2.7,Automation,Cisco Ios,Getpass,多亏了我能够使用他们的示例将telnet连接到Cisco交换机,我将此用于学习目的,特别是学习python 然而,尽管所有代码看起来都很容易阅读,但我对以下内容有点困惑: 1-为什么使用下面的if语句 2-为什么在用户名和密码写入方法之后使用“\n” 3-当更改实际上已提交且成功时,为什么我不能在bash终端上获得输出 HOST = "172.16.1.76" user = raw_input("Enter your Telnet username : ") password = getpass

多亏了我能够使用他们的示例将telnet连接到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."
至于第二点,如果我们在添加密码和用户名后仍要按enter键,为什么要在write方法中的密码和用户名后面使用“\n”?

1:行

password = getpass.getpass()
询问您的密码,如果您将其保留为空,则密码将包含空字符串,该字符串在if语句中与False相同
该脚本不会提前知道您的服务器上是否有密码,它会通过先询问您来模拟知道,如果您没有输入任何内容,它会假定您没有输入任何内容(否则它会一直停留在
tn.read\u上,直到(“密码”)

2:
'\n'
模拟您点击返回键。当您输入密码时,例如
'password'
变量密码将不包含尾随换行符(\n),这就是为什么手动追加它

3:这一个我不知道,可能在执行后5秒的等待时间不够 tn=telnetlib.Telnet(主机) 您已经创建了从您的计算机到主机的telnet通道。但您仍然需要与主机通信以推送/发送您的命令并接收输出

要将命令推送到主机,您需要执行tn.write(“您的\u命令\u或\u输入”),\n表示换行/返回,它告诉您当前的命令现在需要执行。执行后,主机返回结果,结果将被telnet对象“tn”捕获并保存在其“本地缓存”中,您可以使用tn.read_until方法搜索此缓存中的任何预期关键字,如果已找到预期关键字,则read_until将停止(始终在找到第一个关键字时停止),并且您可以执行任何需要的操作(现在轮到您了),否则read_until将继续等待主机的输出(您还没有打开)。最后,如果要检查所有输出是否已缓存,可以执行tn.read_all()


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

github上有一个python库,专门用于远程登录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() 

好的,我想我知道了。谢谢!bascialt“IF statement”将返回输入密码的提示,如果您这样做,它将使其为真,然后在设备提示中查找密码字段并输入输入“ted”(例如单词?)密码。正确吗?至于“\n”,我仍然必须手动按enter键,但在输入用户名和密码后,我会认为“\n”请注意,在telnet连接之前,脚本会向您询问密码。如果您只按enter键,密码将为空。当您用
if
键点击该行时,它会检查密码是否为空,如果不为空,脚本将查看telnet输出,查看它何时请求密码如果为空,脚本将假定telnet不会要求密码。
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()