paramiko.sshclient,paramiko.ssh_exception
说明
1.将所有设备信息写入文本文档。
只需使用txt将登录信息构建到字典中。
2.初始化SSH连接并执行命令。
3.分析该需求指定的命令和输出结果。
将结果存储在文件中。
4.增加多线程执行。
提高效率。
5.添加Linux的crontab。
每小时收集信息(服务器配置)
实例
#!/usr/bin/envpython
#-*-编码:utf-8-*-
进口
进口时间
from concurrent . futureimportthreadpoolexecutor
importparamiko
定义设备列表(文件名):
从文本文件中读取设备列表,并返回由字典组成的列表。
文本格式为:ip、用户名、密码、别名,例如:
1 . 1 . 1 . 1管理员
1 . 1 . 1 . 2管理员
.
Args:
文件名([字符串]) 3360文件名
withopen(文件名, r)asf:
设备列表=[]
forlineinf.readlines():
ip,用户名,密码,name=line.strip()。拆分()
设备列表附加(
{
ip:ip,
用户名 :用户名,
n
bsp;"password":password,
"name":name,
}
)
returndevice_list
classNetworkDevice(object):
def__init__(self,ip="",username="",password="'",name="",port=22,):
self.conn=None
ifip:
self.ip=ip.strip()
elifname:
self.name=name.strip()
else:
raiseValueError("需要设备连接地址(ip或别名)")
self.port=int(port)
self.username=username
self.password=password
self._open_ssh()
def_open_ssh(self):
"""初始化SSH连接,调起一个模拟终端,会话结束前可以一直执行命令。
Raises:
e:抛出paramiko连接失败的任何异常
"""
ssh_connect_params={
"hostname":self.ip,
"port":self.port,
"username":self.username,
"password":self.password,
"look_for_keys":False,
"allow_agent":False,
"timeout":5,#TCP连接超时时间
}
conn=paramiko.SSHClient()
conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
conn.connect(**ssh_connect_params)
exceptExceptionase:
raisee
self.conn=conn.invoke_shell(term="vt100",width=500,height=1000)
return""
defexec_cmd(self,cmd,recv_time=3):
"""登录设备,执行命令
Args:
cmd([type]):命令字符串
recv_time(int,optional):读取回显信息的超时时间.Defaultsto3.
Raises:
EOFError:没有任何信息输出,说明连接失败。
Returns:
output:
"""
cmd=cmd.strip()+"n"
self.conn.sendall("screendisablen")
self.conn.sendall(cmd)
time.sleep(int(recv_time))
output=self.conn.recv(1024*1024)
iflen(output)==0:
raiseEOFError("连接可能被关闭,没有任何信息输出")
returnoutput.decode('utf-8','ignore')
dev={
"ip":"192.168.56.21",
"username":"netdevops",
"password":"Admin@h3c.com",
"name":"sw1"
}
#sw1=NetworkDevice(**dev)
#ret=sw1.exec_cmd("disversion")
#print(ret)
defparse_interface_drop(output):
"""把设备的输出队列丢包信息解析成累加值
命令及输出示例如下:
#[H3C]disqosqueue-statisticsinterfaceoutboundin"^Drop"
#Dropped:0packets,0bytes
"""
ptn=re.compile(r"s(S+):s+(d+)s+(S+),s+(d+)s+(S+)")
count=0
foriinptn.findall(output):
count+=int(i[1])
returncount
defrun(cmd,**conn_parms):
"""登录单台设备,执行指定命令,解析丢包统计
"""
sw=NetworkDevice(**conn_parms)
output=sw.exec_cmd(cmd)
drop_count=parse_interface_drop(output)
return"%s%s%s"%(
conn_parms.get("name"),
conn_parms.get("ip"),
drop_count)
#cmd=r'disqosqueue-statisticsinterfaceoutboundin"^Drop"'
#ret=run(cmd,**dev)
#print(ret)
if__name__=="__main__":
"""获取设备列表,使用多线程登录设备获取信息并返回
"""
withThreadPoolExecutor(10)aspool:
futures=[]
cmd=r'disqosqueue-statisticsinterfaceoutboundin"^Drop"'
dev_info=get_device_list("./iplist.txt")
fordindev_info:
future=pool.submit(run,cmd,**d)
futures.append(future)
#forfinfutures:
#print(f.result())
#根据执行时间把结果写入文件,精确到小时
withopen("./drops/%s.log"%time.strftime("%Y%m%d_%H"),'w')asf:
forlineinfutures:
f.write(line.result()+"n")
以上就是python Paramiko的SSH用法,希望对大家有所帮助。更多Python学习指路:python基础教程
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。