Python 远程登录脚本

Python Telnet script

感谢 Python Library 我能够使用他们的示例远程登录到 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',反正我们添加完就回车了?

1:行

password = getpass.getpass()

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

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

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

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

要将你的命令推送到HOST,你需要执行tn.write("your_commands_or_input \n"),\n表示newline/return,它告诉你当前的命令需要现在执行。执行后,HOST return 结果会被你的telnet 对象"tn" 捕获并保存在它的"local cache" 中,你可以使用[= 在此缓存中搜索你期望的任何关键字23=] 方法,如果找到预期的关键字,read_until 将停止(总是在第一个找到时停止),你可以做任何你需要的事情(现在轮到你了),否则 read_until会一直等待HOST的输出(你还没转)。最后如果你想检查所有的输出是否被缓存,你可以执行 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()