2017-05-16 123 views
0

感谢Python Library我能够使用他们的示例远程登录到思科交换机,我将其用于学习目的,特别是学习python。Python Telnet脚本

然而,虽然所有的代码似乎一般容易阅读,我有点困惑,以下内容:

1 - 为什么使用下面 2- if语句为什么后使用“\ 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") 

至于第二点,为什么要使用的写入方法的密码和用户名后的“\ n”,如果我们要按下回车键后,我们仍要添加呢?

回答

0

1:行

password = getpass.getpass() 

问你为你的密码,如果你离开它空,密码将包含空字符串其中,在if语句,是一样的假
脚本没有按提前知道你的服务器上是否有密码,它通过首先询问你来模拟知道,如果你没有输入任何东西,它就会认为它不会(否则它将永远卡在tn.read_until("Password: ")上。)

2:'\n'模拟你点击返回键,当你输入y我们的密码,例如'password<RETURN>'可变密码将不包含一个尾随换行符(\ n),这就是为什么它被手动所附

3:这一个我不知道,可能是5秒没有足够的时间来等待

+0

好的,我想我明白了。谢谢!所以bascialt“IF语句”是返回提示输入密码,如果你这样做,它使它成真,然后在设备提示符中查找密码字段,并输入input'ted(这样的词?)密码。正确?至于“\ n”,我仍然需要手动输入,虽然我输入用户名和密码后,我会尽管“\ n”会为我照顾这个。 – tafiela

+0

注意脚本在telnet连接之前要求你输入密码。如果你只是按回车,密码将是空的。当你用'if'命令行检查密码是否为空时,如果密码不为空,那么脚本会查看telnet输出以查看密码何时请求并发送。如果它是空的,脚本假定telnet不会要求输入密码。 – Nullman

0

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

要将您的命令推送到HOST,您需要执行tn.write(“your_commands_or_input \ n”),\ n表示换行符/返回值,这表示需要立即执行当前命令。执行完成后,HOST返回结果,这个结果会被你的telnet对象“tn”捕获并保存在它的“本地缓存”中,你可以使用tn.read_until方法在预期的缓存中搜索任何关键字。已经找到了,read_until将会停止(总是在第一次找到的时候停止),并且你可以做任何你需要的事情(现在轮到你了),否则read_until会一直等待来自HOST的输出(你还没有转过来)。最后,如果你想检查所有输出已被缓存,你可以执行tn.read_all()。

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

0

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()