-1

感谢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")

至于第二点,如果我们要在添加后按回车,为什么要在 write 方法中的密码和用户名后面使用'\n'?

4

3 回答 3

0

1:线

password = getpass.getpass()

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

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

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

于 2017-05-16T07:11:33.797 回答
0

执行 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()。

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

于 2017-05-16T09:55:18.937 回答
0

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() 
于 2018-01-12T09:17:30.107 回答