【问题标题】:Python Telnet scriptPython Telnet 脚本
【发布时间】:2017-05-16 07:05:56
【问题描述】:

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

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

【问题讨论】:

    标签: python python-2.7 automation cisco-ios getpass


    【解决方案1】:

    1:行

    password = getpass.getpass()
    

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

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

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

    【讨论】:

    • 好的,我想我明白了。谢谢!所以bascialt“IF语句”正在返回输入密码的提示,如果你这样做了,它就会变为真,然后在设备提示中查找密码字段并输入输入的(这样的词?)密码。正确的?至于“\n”,我仍然需要手动输入,尽管在我输入用户名和密码后,我会认为“\n”会为我处理这个问题。
    • 请注意,脚本会在 telnet 连接之前询问您的密码。如果你只是按回车,密码将为空。当您点击if 时,它会检查密码是否为空,如果它不是空的,脚本将查看 telnet 输出以查看何时请求密码然后发送。如果它为空,则脚本假定 telnet 不会要求输入密码。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 2014-03-15
        • 2023-03-21
        • 2016-09-18
        • 2018-04-30
        • 2012-06-25
        • 2013-07-07
        • 2013-01-19
        • 2012-05-25
        相关资源
        最近更新 更多