【问题标题】:Print SSH output from Cisco Router to a text file将 Cisco 路由器的 SSH 输出打印到文本文件
【发布时间】:2016-09-02 20:32:20
【问题描述】:

我是 Python 以及编程世界的新手。经过过去 2 天的一些研究,我现在能够成功地通过 SSH 连接到 Cisco 路由器并执行一组命令。但是我最初的目标是将结果输出打印到文本文件中。检查了论坛成员的许多帖子,这些帖子帮助我构建了代码,但我无法将结果打印在文本文件上。请帮忙。

这是我的代码:

import paramiko
import sys
import os

dssh = paramiko.SSHClient()
dssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
dssh.connect('10.0.0.1', username='cisco', password='cisco')  
stdin, stdout, stderr = dssh.exec_command('sh ip ssh')
print stdout.read()
f = open('output.txt', 'a')
f.write(stdout.read())
f.close()
dssh.close()

【问题讨论】:

  • 您已经通过调用read 并传递给print 来耗尽stdout。因此,第二个 stdout.read() 不会对 f.write 产生任何影响

标签: python ssh output cisco


【解决方案1】:

stdout.read() 将读取内容并将文件指针向前移动。因此,后续调用将无法再次读取内容。因此,如果您想打印内容将其写入文件,则应先将其存储在变量中,然后再打印并写入。


我可以从文本文件中的 IP 地址列表(逐行提及)中获取它,而不是直接在代码中提及 IP 地址?

您可以像这样从文件中读取行:

with open('filename') as f:
    for line in f:
        # Each line will be iterated; so you could call a function here
        # that does the connection via SSH
        print(line)

【讨论】:

  • 还有一个查询.. 我可以从文本文件中的 IP 地址列表(逐行提及)中获取它,而不是直接在代码上提及 IP 地址吗?请帮忙。
  • 感谢您的意见。现在能够从文件中读取 IP 地址,现在我被困在如何用从文件中读取的 IP 地址代替代码中的实际 IP 地址('10.0.0.1')。有那个功能吗?
  • 如果该行只包含 IP 地址,那么您可以在那里使用 line 变量:dssh.connect(line, …
  • 收到此错误(gaierror: [Errno 11004] getaddrinfo failed)。
  • 那么请打开一个新问题;和这个问题无关。
【解决方案2】:

我知道这已经很晚了,但下面的代码正是我用来完成所要求的事情的代码。

from __future__ import print_function
from netmiko import ConnectHandler

import sys
import time
import select
import paramiko
import re
fd = open(r'C:\Users\NewdayTest.txt','w') 
old_stdout = sys.stdout   
sys.stdout = fd 
platform = 'cisco_ios'
username = 'Username'
password = 'Password'

ip_add_file = open(r'C:\Users\\IPAddressList.txt','r') 

for host in ip_add_file:
    device = ConnectHandler(device_type=platform, ip=host, username=username, password=password)
    output = device.send_command('terminal length 0')
    output = device.send_command('enable')
    print('##############################################################\n')
    print('...................CISCO COMMAND SHOW RUN OUTPUT......................\n')
    output = device.send_command('sh run')
    print(output)
    print('##############################################################\n')
    print('...................CISCO COMMAND SHOW IP INT BR OUTPUT......................\n')
    output = device.send_command('sh ip int br')
    print(output) 
    print('##############################################################\n')

fd.close()

或者,如果您想从单个主机打印,请使用此轻微编辑。这只是删除了查找列表以获取 IP 地址:

from __future__ import print_function
from netmiko import ConnectHandler

import sys
import time
import select
import paramiko
import re
fd = open(r'C:\Users\NewdayTest.txt','w') 
old_stdout = sys.stdout   
sys.stdout = fd
host = '10.10.10.10'
platform = 'cisco_ios'
username = 'Username'
password = 'Password'
device = ConnectHandler(device_type=platform, ip=host, username=username, password=password)
output = device.send_command('terminal length 0')
output = device.send_command('enable')
print('##############################################################\n')
print('...................CISCO COMMAND SHOW RUN OUTPUT......................\n')
output = device.send_command('sh run')
print(output)
print('##############################################################\n')
print('...................CISCO COMMAND SHOW IP INT BR OUTPUT......................\n')
output = device.send_command('sh ip int br')
print(output) 
print('##############################################################\n')

fd.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多