#!/usr/bin/env python #_*_coding:utf-8_*_ #Author:Tiger At ''' 1.此脚本使用python3编写 2.此脚本用于通过linux堡垒机登录网络设备 3.仅供学习和参考 ''' #导入对应模块 from netmiko import ConnectHandler from netmiko import redispatch import getpass from datetime import datetime import time #输入堡垒机IP地址 jumpserver_ip = input('jumpserver_ip: ') #输入堡垒机用户名 jumpserver_username = input('jumpserver_username: ') #输入堡垒机用户密码,注getpass模块在pycharm上运行有问题 jumpserver_password = getpass.getpass('jumpserver_password: ') #定义堡垒机 jumpserver = { #定义堡垒机类型 'device_type': 'ovs_linux', #定义堡垒机IP 'ip': jumpserver_ip, #定义堡垒机用户名 'username': jumpserver_username, #定义堡垒机密码 'password': jumpserver_password, } #输入要管理设备的用户名/密码信息 username = input('aaa_username: ') password = getpass.getpass('aaa_password: ') #从文件“ip_list.txt”读取设备管理IP地址信息,默认在同级目录下创建此文件即可 ip_file = list(open('ip_list.txt', 'r')) #从文件“command.txt”读取操作命令信息,默认在同级目录下创建此文件并添加对应要执行的命令即可 command_file = list(open('command.txt', 'r')) #打开错误文件“Error_list.txt”以便存放错误信息,默认在同级目录下创建此文件即可 error_file = open('Error_list.txt', 'a') #创建连接堡垒机对象,连接堡垒机 net_connect = ConnectHandler(**jumpserver) for line in ip_file: #显示堡垒机提示符 print(net_connect.find_prompt()) try: #获取IP地址信息 ip = line.strip() #打印当前时间 print('===============================' + datetime.now().strftime( "%Y-%m-%d %H:%M:%S") + '===============================' + '\n') #进行telnet操作 net_connect.write_channel('telnet ' + ip + '\n') #等待2秒 time.sleep(2) #存储登录结果,后续用于判断 result = net_connect.read_channel() #打印登录结果 print(result) #根据返回结果判断是否使用ssh登录 if 'foreign host' in result or 'Connection refused' in result: #尝试SSH登录 net_connect.write_channel('ssh -l ' + username + ' ' + ip + '\n') time.sleep(1) #存储SSH结果 result1 = net_connect.read_channel() #打印SSH结果 print(result1) #判断是否提示存储秘钥 if '(yes/no)' in result1: net_connect.write_channel('yes' + '\n') time.sleep(1) #输入密码进行登录 net_connect.write_channel(password + '\n') time.sleep(1) #判断TELNET登录提示符,用于TELNET登录 if 'username' in result or 'Username' in result: #调用用户名/密码信息尝试TELNET登录 net_connect.write_channel(username + '\n' + password + '\n') time.sleep(1) #关联设备类型,以便后续进行对应厂家命令操作 redispatch(net_connect, device_type='cisco_ios') #打印设备提示符 print(net_connect.find_prompt()) #获取相应命令,进行相关命令输入 for command in command_file: show_commands = command.strip() #保存命令输入结果 output = net_connect.send_command(show_commands) #创建对应记录保存文件 syslog = open(ip + '.txt', 'a+') #将结果写入创建的日志文件 syslog.write(net_connect.find_prompt() + show_commands + '\n' + output + '\n') #退出设备 net_connect.send_command_timing('exit') 异常存储及打印 except: print(ip + ' error') error_file.write(ip + ' error' + '\n')