主要问题可能在于class write_data类,以及华为类中的write_data调用,或者是登录操作完成后没有保持连接??我也不知道问题出在哪,以上是我自己的怀疑,希望有知道问题原因的学霸能为我解答一下。
源码:
import telnetlib
import logging
import paramiko
import os
import time
import xlrd
import xlwt
from paramiko import SSHClient
#定义登录方法-SSH&&TELENT
class login_client:
def __init__(self):
self.telnet = telnetlib.Telnet()
self.ssh = paramiko.SSHClient()
def SSH(self,hostname,port,username,password):
try:
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机
self.ssh.connect(hostname, port, username, password,allow_agent=False, look_for_keys=False) # 连接服务器
dis_cu = self.ssh.invoke_shell().recv(999999).decode()
print(hostname + '主机SSH登录成功!')
time.sleep(2)
print(dis_cu)
except:
print(hostname + '主机SSH登录失败!' + '\n' + 'Error:请检查相应的IP地址、登录方式、端口号、账号密码是否正确;请稍后重试。')
def TELNET(self,hostname,port,username,password):
try:
# self.tn = telnetlib.Telnet(host_ip,port=23)
self.telnet.open(hostname,port)
except:
print(host_ip + '网络连接失败')
return False
# 等待Username:出现后输入用户名,最多等待2秒
self.telnet.read_until(b'Username: ',timeout=2)
self.telnet.write(username.encode('ascii') + b'\n')
# 等待Password:出现后输入用户名,最多等待2秒
self.telnet.read_until(b'Password: ',timeout=2)
self.telnet.write(password.encode('ascii') + b'\n')
# 延时两秒再收取返回结果,给服务端足够响应时间
time.sleep(2)
# 获取登录结果
# read_very_eager()获取到的是的是上次获取之后本次获取之前的所有输出
command_result = self.telnet.read_very_eager().decode('ascii')
if 'Login incorrect' not in command_result:
print(hostname + '主机Telnet登录成功')
print(command_result)
return True
else:
print(hostname + '登录失败,用户名或密码错误')
print(command_result)
return False
#定义数据写入
class write_data:
def __init__(self):
self.telnet = telnetlib.Telnet()
self.ssh = paramiko.SSHClient()
def ssh_write(self,file):
commands = open(file, 'r', encoding='UTF-8')
for i in commands:
if i != '':
self.ssh.invoke_shell().send(str(i))
time.sleep(1)
elif i == '':
return True
else:
return False
results = self.ssh.invoke_shell().recv(999999).decode()
print(results)
def telnet_write(self,file):
commands = open(file, 'r', encoding='UTF-8')
for i in commands:
print(type(i))
self.telnet.write(i.encode('ascii')+b'\n')
time.sleep(1)
results = self.telnet.read_very_eager().decode('ascii')
print(results)
#定义华为设备类
class huawei:
def login(self,host_ip,login_type,port,username,password):
self.login = login_client() #初始化登录客户端类,调用其类中的方法
if str(login_type) == 'SSH':
self.login.SSH(host_ip,port,username,password)
elif str(login_type) == 'TELNET':
self.login.TELNET(host_ip,port,username,password)
else:
print(host_ip + '登录异常,请检查login_type字段是否正确!')
def put(self,login_type,file):
self.write=write_data()
if str(login_type) == 'SSH':
self.write.ssh_write(file)
elif str(login_type) == 'TELNET':
self.write.telnet_write(file)
else:
print(host_ip + '请求错误,请检查login_type字段!')
if __name__ == '__main__':
file=xlrd.open_workbook(r'E:\python_crawler\Auto_yunwei\list.xlsx')
sheet1=file.sheet_by_name('Sheet1')
begin_number = 1
while (begin_number < 3):
hostip_number = 0
login_type_number = 1
port_number = 2
manufacturer_number = 3
username_number = 4
password_number = 5
host_ip=sheet1.cell(begin_number, hostip_number).value #参数-IP地址
login_type=sheet1.cell(begin_number, login_type_number).value #参数-登录类型
port=int(sheet1.cell(begin_number, port_number).value) #参数-端口号
manufacturer=sheet1.cell(begin_number, manufacturer_number).value #参数-厂商
username=sheet1.cell(begin_number, username_number).value #参数-用户名
password=sheet1.cell(begin_number, password_number).value #参数-密码
#print(host_ip,login_type,port,manufacturer,username,password)
HUAWEI=huawei() #初始化huwei类
if str(manufacturer) == 'huawei':
if HUAWEI.login(host_ip,login_type,port,username,password): #调用华为类的登录方法
file = 'E:\python_crawler\Auto_yunwei\huawei.txt'
HUAWEI.put(login_type, file)
else:
print('该主机厂商目前未支持!请手动配置!')
break
begin_number+=1
file = 'E:\python_crawler\Auto_yunwei\huawei.txt'
->
file = r'E:\python_crawler\Auto_yunwei\huawei.txt'
或者
file = 'E:\\python_crawler\\Auto_yunwei\\huawei.txt'